알고리즘 문제풀이/백준

#2930 : 가위 바위 보

모항 2022. 4. 16. 19:27

풀이방법

사용된 것:

그리디 알고리즘

브루트포스 알고리즘

 

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