풀이방법
사용된 것:
그리디 알고리즘
브루트포스 알고리즘
2022.04.16
각 라운드별 친구들이 낸 가위의 수, 바위의 수, 보의 수를 세놓으면 그 다음부터는 쉽다.
알고리즘은 간단하지만 코드로 구현하기가 조금 귀찮은 문제였다.
푼 방법은 다음과 같다.
백준의 세 번째 예제를 보면,
4
SPRS
4
RPRP
SRRR
SSPR
PSPS
1라운드에서 가위를 낸 친구는 2명, 바위를 낸 친구는 1명, 보를 낸 친구는 1명이다.
2라운드에서 가위를 낸 친구는 2명, 바위를 낸 친구는 1명, 보를 낸 친구는 1명이다.
3라운드에서 가위를 낸 친구는 0명, 바위를 낸 친구는 2명, 보를 낸 친구는 2명이다.
4라운드에서 가위를 낸 친구는 1명, 바위를 낸 친구는 2명, 보를 낸 친구는 1명이다.
이렇게 개수를 싹 세서 다음과 같은 2차원 정수 배열에 저장하였다.
가위를 낸 친구 수 | 바위를 낸 친구 수 | 보를 낸 친구 수 | |
라운드 1 | 2 | 1 | 1 |
라운드 2 | 2 | 1 | 1 |
라운드 3 | 0 | 2 | 2 |
라운드 4 | 1 | 2 | 1 |
이걸 한 번 해놓으면 정답을 쉽게 구할 수 있다.
상근이의 실제 점수와 최대 점수를 구할 때 모두
모든 친구가 낸 모든 모양들을 고려해야 하고,
상근이의 최대 점수를 구할 때에는
상근이가 각각 가위를 냈을 때, 바위를 냈을 때, 보를 냈을 때의 예상 점수 총 세 가지를 모조리 구해야 하므로
브루트포스 알고리즘에 해당하는 문제이다.
최대 점수를 구하는 문제이므로 그리디 알고리즘에 해당하는 문제이다.
코드
Java(2022.04.16)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int r = Integer.parseInt(br.readLine()); //라운드 수
char[] sg = br.readLine().toCharArray(); //각 라운드별 상근이가 낸 모양
int n = Integer.parseInt(br.readLine()); //친구들 수
//각 라운드마다 가위(S), 바위(R), 보(P)를 낸 친구 수를 구하기
int[][] times = new int[r][3]; //여기에 저장
for(int i = 0; i<n; i++) { //친구의 명수만큼 반복
char[] temp = br.readLine().toCharArray(); //이번 친구가 낸 모양들을 읽어오기
for(int j = 0; j<r; j++) {
if(temp[j] == 'S') { //가위
times[j][0]++;
}else if(temp[j] == 'R') { //바위
times[j][1]++;
}else { //보
times[j][2]++;
}
}
}
//상근이의 점수 구하기
int score1 = 0;
for(int i = 0; i<r; i++) {
//상근이가 이번에 낸 모양
char mine = sg[i];
if(mine == 'S') { //상근이가 가위를 낸 라운드
score1 += 2 * times[i][2];
score1 += times[i][0];
}else if(mine == 'R') { //상근이가 바위를 낸 라운드
score1 += 2 * times[i][0];
score1 += times[i][1];
}else { //상근이가 보를 낸 라운드
score1 += 2 * times[i][1];
score1 += times[i][2];
}
}
//상근이가 얻을 수 있는 최대 점수 구하기
int score2 = 0;
for(int i = 0; i<r; i++) {
//이번 라운드에서 상근이가 각각 가위(srp[0]), 바위(srp[1]), 보(srp[2])를 냈을 때 얻는 점수
int[] srp= new int[3];
srp[0] = (2 * times[i][2]) + times[i][0];
srp[1] = (2 * times[i][0]) + times[i][1];
srp[2] = (2 * times[i][1]) + times[i][2];
//셋 중 최댓값 취하기
Arrays.sort(srp);
score2 += srp[2];
}
//정답 출력하기
System.out.println(score1);
System.out.println(score2);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
#1978 : 소수 찾기 (0) | 2022.04.17 |
---|---|
#2609 : 최대공약수와 최소공배수 (0) | 2022.04.17 |
#4673 : 셀프 넘버 (0) | 2022.04.16 |
#1966 : 프린터 큐 (0) | 2022.04.13 |
#11650 : 좌표 정렬하기 (0) | 2022.04.13 |