티스토리 뷰

Algorithm

[백준] S1 12739 돌림판 (Small) (java)

코딩브론즈 2021. 7. 30. 01:17

https://www.acmicpc.net/problem/12739

 

12739번: 돌림판 (Small)

지훈이는 경품 이벤트를 진행하기 위해서 원형판이 N등분 되어 있고, 각 N등분된 곳에 빨간색 또는 초록색 또는 파란색이 색칠되어 있는 돌림판을 준비하였다. 이 이벤트의 룰은 간단하다. 이벤

www.acmicpc.net

 

풀이

 

1) 돌림판의 색을 저장할 board[] 배열과 swap을 위한 temp[] 배열을 생성한다.

2) K번 반복하는 반복문 생성. (색을 바꾸는 횟수)

3) N번 반복하는 반복문 생성. (돌림판이 나누어진 수)

4) 주어진 규칙에 따라 해당 색을 어떤 색으로 바꿀지 판단한다.

4-1) 이전-현재-다음 의 색상이 모두 동일할 경우 현재 색을 파란색으로 바꾼다.

4-2) 아닐경우, 빨강 2 초록1 or 초록2 파랑1 or 파랑2 빨강1 일 경우와 아닌 경우로 나눈다.

4-2-1) 긴 경우 : 현재 색을 빨간색으로 바꾼다.

4-2-2) 아닌 경우 : 현재 색을 초록색으로 바꾼다.

ㄴ 돌림판의 특성상 0번과 N-1번이 연결되어 있다. 알아서 잘 처리하자.

5) 반복문이 모두 끝나면 board를 탐색해 색깔들의 개수를 출력한다.

 

 

주의사항

 

1) N이 1or 2일 경우 왼쪽과 오른쪽을 어떻게 할지 모호하다. 실험 결과 해당 테스트 케이스가 없다. 이럴거면 N>=3 이라고 해놓지..

 

package com.baekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.StringTokenizer;

public class BJ_S2_12739_돌림판small {
	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	static int N, K;
	static char board[], temp[];
	public static void main(String[] args) throws NumberFormatException, IOException {
		input = new BufferedReader(new StringReader(src));
		tokens = new StringTokenizer(input.readLine());
		N = Integer.parseInt(tokens.nextToken());
		K = Integer.parseInt(tokens.nextToken());
		String line = input.readLine();
		board = new char[N];
		temp = new char[N];
		for(int i=0; i<N; i++) {
			board[i] = line.charAt(i);
		}
		if(N == 1) { 
			board[0] = 'G';
		}else {
			for(int k=0; k<K; k++) {
				for(int i=0; i<N; i++) {
					if(i == 0) {
						if((board[0] == board[1] && board[0] == board[N-1]) ||
								(board[0] != board[1] && board[0] != board[N-1] && board[1] != board[N-1])) {
							temp[0] = 'B';
						}else {
							separate(board[N-1],board[0],board[1], i);
						}
					}else if(i == N-1) {
						if((board[0] == board[N-2] && board[0] == board[N-1]) ||
								(board[0] != board[N-2] && board[0] != board[N-1] && board[N-2] != board[N-1])) {
							temp[N-1] = 'B';
						}else {
							separate(board[N-2],board[N-1],board[0], i);
						}
					}else {
						if((board[i] == board[i+1] && board[i] == board[i-1]) ||
								(board[i] != board[i+1] && board[i] != board[i-1] && board[i+1] != board[i-1])) {
							temp[i] = 'B';
						}else {
							separate(board[i-1],board[i],board[i+1], i);
						}
					}
				}
				board = temp.clone();
//				System.out.println(Arrays.toString(board));
			}
		}
		int cR = 0, cG = 0, cB = 0;
		for(int i=0; i<N; i++) {
			if(board[i] == 'R') {
				cR++;
			}else if(board[i] == 'G') {
				cG++;
			}else {
				cB++;
			}
		}
		System.out.println(cR+" "+cG+" "+cB);
	}

	private static void separate(char color1, char color2, char color3, int i) {
		int cR=0, cG=0, cB=0;
		if(color1 == 'R') {
			cR++;
		}else if(color1 == 'G') {
			cG++;
		}else {
			cB++;
		}
		if(color2 == 'R') {
			cR++;
		}else if(color2 == 'G') {
			cG++;
		}else {
			cB++;
		}
		if(color3 == 'R') {
			cR++;
		}else if(color3 == 'G') {
			cG++;
		}else {
			cB++;
		}
		if((cR==2 && cG==1) || (cG==2 && cB==1) || (cB==2 && cR==1)) {
			temp[i] = 'R';
		}else {
			temp[i] = 'G';
		}
	}
	
	static String src =
			"1 5\r\n"
			+ "R";
}

 

후기

 

 딱히 어려울점 없는 양산형 시뮬레이션 알고리즘이다. 문제 설명이 조금 부족하다. 그림으로 표현해 줬으면 좀 괜찮았을텐데..

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함