728x90
반응형
https://www.acmicpc.net/problem/14891
프로세스 순서 착오에 의해 문제를 푸는데만 3일이 넘게 걸렸다..
728x90
대충 이해했던 프로세스는 아래와 같다.
---> 1. 지정받은 번호의 톱니바퀴를 방향에 맞게 일단 회전시킨다.
---> 2. 회전시킨 후, 왼쪽과 오른쪽 톱니바퀴의 극을 비교한다
---> 3. 극이 다르면 비교 대상의 톱니바퀴를 반대방향으로 회전시킨다.
---> 4. 2 ~ 3번을 반복한다
로 이해했었는데 아주 잘못된 이해였다.
진짜 이래서 지문 읽는 것을 정말 잘해야한다..
반응형
※ 문제 해결 방안
(1) 입력값들을 입력받고 방향배열 int[] dirArr을 반드시 초기화해준다.
(2) 입력받은 톱니바퀴 번호에 해당하는 방향배열 인덱스에 입력받은 방향을 넣어준다
(3) 왼쪽, 오른쪽 방향으로 탐색을 한다.
(4) 탐색이 다 끝났으면 모든 톱니바퀴를 방향이 지정된대로 회전시킨다.
(5) 1번으로 돌아가서 4번까지 지정된 횟수에 맞게 순환한다.
(6) 점수를 구한다.
package simulation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class GearRotation {
static int[][] gear = new int[4][8];
static int score = 0;
static int[] dirArr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < gear.length; i++) {
String[] arr = br.readLine().split("");
for (int j = 0; j < arr.length; j++) {
gear[i][j] = stoi(arr[j]);
}
}
int K = stoi(br.readLine());
while (K-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int idx = stoi(st.nextToken()) - 1;
int dir = stoi(st.nextToken());
dirArr = new int[4]; // 방향 배열 초기화
dirArr[idx] = dir;
checkToothL(idx, dir*-1); // 좌측 탐색
checkToothR(idx, dir*-1); // 우측 탐색
for (int i = 0; i < dirArr.length; i++) rotate(i, dirArr[i]); // 회전 방향 모두 설정한 후 톱니바퀴를 회전시킨다
}
for (int i = 0; i < gear.length; i++) {
if (gear[i][0] == 1)
score += 1 << i;
}
System.out.println(score);
}
public static void rotate(int idx, int dir) {
int temp = 0;
if (dir == 1) {
temp = gear[idx][7];
for (int i = gear[idx].length - 1; i > 0; i--) {
gear[idx][i] = gear[idx][i - 1];
}
gear[idx][0] = temp;
} else if(dir == -1) {
temp = gear[idx][0];
for (int i = 0; i < gear[idx].length - 1; i++) {
gear[idx][i] = gear[idx][i + 1];
}
gear[idx][7] = temp;
}
}
public static void checkToothR(int left, int dir) {
int right = left + 1;
if (right > 3) return;
if (gear[left][2] != gear[right][6]) {
dirArr[right] = dir;
checkToothR(right, dir*-1);
}
}
public static void checkToothL(int rihgt, int dir) {
int left = rihgt - 1;
if (left < 0) return;
if (gear[left][2] != gear[rihgt][6]) {
dirArr[left] = dir;
checkToothL(left, dir * -1);
}
}
public static int stoi(String str) {
return Integer.parseInt(str);
}
}
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준/java] 2468번 : 안전 영역 - BFS (0) | 2021.08.14 |
---|---|
[백준/java] 4963번 : 섬의 개수 - BFS (0) | 2021.08.13 |
[백준/java] 1932번: 정수 삼각형 - DP (0) | 2021.08.12 |
[백준/java] 21922번: 학부 연구생 민상 - BFS (0) | 2021.08.10 |
[백준/java] 1926번: 그림 - BFS(Breath-First-Search) (0) | 2021.08.07 |
댓글