티스토리 뷰
https://www.acmicpc.net/problem/12739
풀이
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";
}
후기
딱히 어려울점 없는 양산형 시뮬레이션 알고리즘이다. 문제 설명이 조금 부족하다. 그림으로 표현해 줬으면 좀 괜찮았을텐데..
'Algorithm' 카테고리의 다른 글
[백준] G4 17135 캐슬 디펜스 (java) (0) | 2021.08.04 |
---|---|
[백준] G4 16235 나무 재테크 (java) (0) | 2021.07.30 |
[백준] S1 20055 컨베이어 벨트 위의 로봇 (java) (0) | 2021.07.30 |
[백준] S1 13335 트럭 (java) (0) | 2021.07.30 |
[백준] S1 1052 물병 (java) (0) | 2021.07.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 구현
- 알고리즘
- BFS
- react
- map
- Spring
- 다익스트라
- 현꾸라지
- 시뮬레이션
- DFS
- 우선순위큐
- laugh4mile
- 객체지향
- G5
- 코딩새내기
- 그리디
- S3
- SWEA
- S2
- Spring Boot
- 백트래킹
- 리액트 네이티브
- java
- PriorityQueue
- 리액트
- 백준
- react native
- 문자열
- 자바
- g4
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함