https://www.acmicpc.net/problem/14891
시뮬레이션 문제 이다.
풀이 방법
1. 톱니바퀴의 극을 입력 받는다. 문자로 입력 받으면 아스키 코드로 출력되기 때문에 (int) input.charAt()-48를 사용하여 정수로 변환한다.
2. 특정 톱니바퀴(3번)의 우측 톱니바퀴(4번) 회전 정보를 확인한다. 극이 다르면 현재 톱니바퀴 방향의 반대 방향으로 설정한다. 우측과 마찬가지로 좌측 톱니바퀴(2번, 1번) 회정 정보를 확인한다. 좌측 톱니바퀴는 2개이기 때문에 회전 전파가 이루어져야 한다.
3. 회전 정보에 맞춰서 톱니바퀴를 방향에 맞춰 회전 시킨다.
4. 각 톱니바퀴에 맞는 점수를 계산하여 출력한다.
정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
public class Main {
static LinkedList<Integer>[] wheel = new LinkedList[5];
static int[] directInfo;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 톱니 바퀴 입력받기
for(int i=1 ; i<=4 ; i++) {
wheel[i] = new LinkedList<>();
String input = br.readLine();
for(int j=0 ; j<input.length() ; j++) {
wheel[i].addLast((int) input.charAt(j)-48);
}
}
int N = Integer.parseInt(br.readLine());
for(int i=0 ; i<N ; i++) {
directInfo = new int[5];
String input[] = br.readLine().split(" ");
int wheelNum = Integer.parseInt(input[0]);
directInfo[wheelNum] = Integer.parseInt(input[1]);
turnCheck(wheelNum);
roll();
}
// 톱니바퀴 점수별 계산
int sum = 0;
sum += wheel[1].get(0)*(1);
sum += wheel[2].get(0)*(2);
sum += wheel[3].get(0)*(4);
sum += wheel[4].get(0)*(8);
System.out.print(sum);
}
static void roll() {
for(int i=1 ; i<5 ; i++) {
if(directInfo[i] != 0) {
if(directInfo[i] == 1) { // 시계 방향
wheel[i].addFirst(wheel[i].pollLast()); // 마지막 요소를 첫번째로 이동
} else { // 반시계 방향
wheel[i].addLast(wheel[i].pollFirst()); // 첫번째 요소를 마지막으로 이동
}
}
}
}
static void turnCheck(int num) {
// 우측 톱니바퀴 회전 정보 설정
for(int i=num ; i<4 ; i++) {
if(wheel[i].get(2) != wheel[i+1].get(6)) { // 우측 톱니바퀴 극 확인
directInfo[i+1] = directInfo[i]*(-1); // 다르면 반대 방향으로 설정
} else {
break; // 같으면 회전 전파 중지
}
}
// 좌측 톱니바퀴 회전 정보 설정
for(int i=num-1 ; i>0 ; i--) {
if(wheel[i].get(2) != wheel[i+1].get(6)) { // 좌측 톱니바퀴 극 확인
directInfo[i] = directInfo[i+1]*(-1); // 다르면 반대 방향으로 설정
} else {
break; // 같으면 회전 전파 중지
}
}
}
}
느낀점
레벨이 골드라고 풀어나가는데 너무 오래 걸렸다. 문제 전체를 이해하는 것도 중요하지만, 원하는 바만 파악해서 결과를 위한 내용으로 풀어내는 것이 중요하다고 느꼈다. 아직도 코딩으로 과정을 풀어나가는 것이 어렵다. 하지만 이해하면서 본인의 부족한 점이 무엇인지 파악하고, 해결해나가면 천천히 실력이 늘 수 있을 것이라고 믿는다.!
'코딩테스트 > 백준(Beakjoon)' 카테고리의 다른 글
[백준] 1022 소용돌이 이쁘게 출력하기(JAVA) (1) | 2024.10.03 |
---|---|
[백준] 2579 계단 오르기 (JAVA) 풀이 - DP (0) | 2024.09.10 |
[백준] 1074 Z (JAVA) 풀이 (0) | 2024.09.05 |
[백준] 1713 후보 추천하기 (JAVA) 풀이 (0) | 2024.08.20 |
[백준] 5212 지구온난화 (JAVA) 풀이 (0) | 2024.08.19 |