문제 내용은 가위바위보를 해서 이기면 2점 비기면 1점 지면 0점이고 정직하게 했을 경우와 가장 고득점 하는 경우의 값을 출력해줘야 하는데 입력을 보면 5를 입력하면 5글자가 들어온다는 얘기고 이후 S, P, R로 이루어진 5글자가 들어온 것이 보인다.
다음으로 들어오는 입력은 친구의 수고, 친구의 수 만큼 맨 처음 입력으로 들어온 글자 수 만큼 친구들이 S, P, R 로 텍스트를 구성해서 들어오게 되는데
예제 출력에서 첫 번째 값은 상근이가 정직하게 가위바위보를 했을 경우의 점수고
두 번째 값은 최선의 수만 나오는 경우의 점수를 출력해줘야 하는데, 그냥 다 2 주면 되는거 싶겠지만, 주의해야 할 것이 친구가 여럿일 경우 모든 친구들과 한 번에 가위바위보를 하기 때문에, 4명과 한다 치면 가장 높은 점수를 얻을 수 있는 값을 사용해야 한다는 거다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// 점수 구하기
public static int getScore(char sang, char friend) {
if(sang == friend) {
return 1;
}
// 비기지 않으면 이기거나 지거나 뿐
switch (sang) {
case 'R':
return friend == 'S' ? 2 : 0;
case 'P':
return friend == 'R' ? 2 : 0;
case 'S':
return friend == 'P' ? 2 : 0;
default:
return 0;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int round = Integer.parseInt(br.readLine());
String sang = br.readLine();
int friendsNumber = Integer.parseInt(br.readLine());
String[] friendArr = new String[friendsNumber];
for(int i = 0; i<friendsNumber; i++) {
friendArr[i] = br.readLine();
}
int normalScore = 0;
int bestScore = 0;
for (int i = 0; i < round; i++) {
int r = 0;
int p = 0;
int c = 0;
for (int j = 0; j < friendsNumber; j++) {
char friendChar = friendArr[j].charAt(i);
normalScore += getScore(sang.charAt(i), friendChar);
r += getScore('R', friendChar);
p += getScore('P', friendChar);
c += getScore('S', friendChar);
}
bestScore += Math.max(Math.max(r, p), c);
}
System.out.println(normalScore);
System.out.println(bestScore);
}
}
문제를 풀어보자면 일단 상근이와 친구들의 값을 받아서 점수를 반환해주는 메소드 getScore를 만들어야 하는데 같지 않으면 이기거나 지는 경우밖에 없기 때문에 간단히 만들어줄 수 있다.
다음에는 입력 값들을 받아서 정직하게 했을 경우가 최선의 값을 사용했을 경우를 구해줘야 하는데, for문을 입력으로 들어온 글자 수 만큼 돌려주면서 정직하게 하나씩 비교해주는 normalScore를 계산해주고 최선의 값의 경우에는 R, P, S 모든 경우의 수로 다 던져본 뒤, 가장 점수가 높게 나오는 경우만 더해주면 된다.
이후 출력을 해 주면 정직하게 한 점수와, 최선의 점수를 확인할 수 있다.
Leave a Reply