문제
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3 × 100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2 ×1,000으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6 × 100으로 계산되어 600원을 상금으로 받게 된다.
N(2 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 참여하는 사람 수 N이 주어지고 그다음 줄부터 N개의 줄에 사람들이 주사위를 던진 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
출력
첫째 줄에 가장 많은 상금을 받은 사람의 상금을 출력한다.
로직은 굉장히 쉬운 문제였지만 입력을 받을때 주사위의 눈을 공백을 두고 받아야 하기 때문에 이 받은 정보를 어떻게 처리할까에 대해
고민을 했어용
1. split()을 사용해 공백 단위로 나누기
2. StringTokenizer을 사용하여 문자열 토큰화 시키기
그래서 두 개의 차이점을 찾아보았다.
StringTokenizer는 결괏값이 문자열이라면 split은 결과값이 문자열 배열이라는 점.
이외에 더 많은 차이점이 있으나 그건 직접 찾아보시길..
그리도 또 성능의 차이.
아주 정리가 잘 되어있다 한 번씩 보는 걸 추천!!🥹
이러한 이유로 StringTokenizer가 성능이 더 좋을 거 같아 선택하였어용!
문제풀이 1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Scanner;
public class BJ_CT_2 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n=sc.nextInt();
int max=0;
for(int i=0;i<n;i++){
int sum=0;
StringTokenizer st = new StringTokenizer(br.readLine()); //3 3 6 공백으로
받아온 문자열을 공백으로 구분해 토큰화 해준다
int x= Integer.parseInt(st.nextToken()); //3
int y= Integer.parseInt(st.nextToken()); //3
int z= Integer.parseInt(st.nextToken()); //6
if(x==y&&y==z){ //다같은눈
sum=10000+(x*1000);
}else if (x!=y&&y!=z&&z!=x){ //다다른눈
sum=Math.max(Math.max(x,y),z)*100;
}else{ //같은눈이 2개만
if(x==y) sum= 1000+(x*100);
else if(y==z) sum= 1000+(x*100);
else if(z==x) sum= 1000+(x*100);
}
if(sum>max) max=sum;
}
System.out.println(max);
}
}
NullPointer 에러가 났다 분명 인텔리제이에선 잘 돌아갔는데.. 뭐 한 번에 풀리는 게 없니...🥹
그래서 백준 NullPointer에러에 대해서 찾아보았다. Scanner와 BufferedReader를 둘 다 쓰면 그럴 수도 있다 해서
Scanner로 받은 입력 횟수를 BufferredReader로 받아서 수정해보았다
문제풀이 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_CT_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine()); //scanner가 아닌 br로 받아주고
int max=0;
for(int i=0;i<n;i++){
int sum=0;
StringTokenizer st = new StringTokenizer(br.readLine());
int x= Integer.parseInt(st.nextToken());
int y= Integer.parseInt(st.nextToken());
int z= Integer.parseInt(st.nextToken());
if(x==y&&y==z){ //다같은눈
sum=10000+(x*1000);
}else if (x!=y&&y!=z&&z!=x){ //다다른눈
sum=Math.max(Math.max(x,y),z)*100;
}else{ //같은눈이 2개만
if(x==y) sum= 1000+(x*100);
else if(y==z) sum= 1000+(x*100);
else if(z==x) sum= 1000+(x*100);
}
if(sum>max) max=sum;
}
System.out.println(max);
}
}
왜 그러는 건데 우리 좋았잖아..
너네 왜 다 x로 되어있는....
오늘의 교훈
코드 복붙을 자제하자.
최종정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_CT_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine()); //scanner가 아닌 br로 받아주고
int max=0;
for(int i=0;i<n;i++){
int sum=0;
StringTokenizer st = new StringTokenizer(br.readLine());
int x= Integer.parseInt(st.nextToken());
int y= Integer.parseInt(st.nextToken());
int z= Integer.parseInt(st.nextToken());
if(x==y&&y==z){ //다같은눈
sum=10000+(x*1000);
}else if (x!=y&&y!=z&&z!=x){ //다다른눈
sum=Math.max(Math.max(x,y),z)*100;
}else{ //같은눈이 2개만
if(x==y) sum= 1000+(x*100);
else if(y==z) sum= 1000+(y*100);
else if(z==x) sum= 1000+(z*100);
}
if(sum>max) max=sum;
}
System.out.println(max);
}
}
휴 참 쉬운 문제를 이렇게 헤매서 얼탱이가 없지만 암튼 통과!!
'알고리즘🪺 > 백준' 카테고리의 다른 글
[JAVA] 백준 1789번: 수들의 합 (0) | 2022.11.30 |
---|---|
[JAVA] 백준 17608번: 막대기 (0) | 2022.11.28 |
[JAVA] 백준 8958번: OX퀴즈 (0) | 2022.11.24 |
[JAVA] 백준 1075번: 나누기 (0) | 2022.11.24 |
[JAVA] 백준 17618번: 신기한 수 (0) | 2022.11.23 |