https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
저는 구현을 통해 문제를 해결하였습니다.
먼저 LinkedList로 톱니들을 표현하였고, 회전하는 톱니의 왼쪽 오른쪽으로의 자성을 체크하여, 돌아가는지 돌아간다면 회전 방향은 어떻게 되는지를 확인 후, 한번에 회전시켰습니다. 체크를 먼저하고 그 다음 모든 톱니바퀴를 해당 하는 회전 방향으로 회전하였습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
private static final int LEFT_INDEX = 6;
private static final int RIGHT_INDEX = 2;
private static final int CLOCK_DIR = 1;
private static final int REVERSE_CLOCK_DIR = -1;
private static final int[] SCORE = {1,2,4,8};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
LinkedList<Integer>[] gears = new LinkedList[4];
for (int i = 0; i < 4; i++) {
gears[i] = new LinkedList<>();
String command = br.readLine();
for (int j = 0; j < 8; j++) {
char ch = command.charAt(j);
gears[i].add(Integer.parseInt(ch + ""));
}
}
int k = Integer.parseInt(br.readLine());
for (int i = 0; i < k; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int number = Integer.parseInt(st.nextToken())-1;
int dir = Integer.parseInt(st.nextToken());
moveGears(gears, number, dir);
}
int totalScore = 0;
for(int i = 0 ; i < 4; i++){
totalScore += SCORE[i] * gears[i].get(0);
}
System.out.println(totalScore);
}
private static void moveGears(LinkedList<Integer>[] gears, int number, int dir) {
int[] gearDir = new int[4];
gearDir[number] = dir;
int now = number + 1;
while (now < 4) {
if (gears[now].get(LEFT_INDEX) != gears[now - 1].get(RIGHT_INDEX)) {
gearDir[now] = -gearDir[now - 1];
now++;
}else{
break;
}
}
now = number - 1;
while (now >= 0) {
if (gears[now].get(RIGHT_INDEX) != gears[now + 1].get(LEFT_INDEX)) {
gearDir[now] = -gearDir[now + 1];
now--;
}else{
break;
}
}
for(int i = 0 ; i < 4 ; i++){
moveGear(gears[i],gearDir[i]);
}
}
private static void moveGear(LinkedList<Integer> gear, int clockDir) {
if (clockDir == CLOCK_DIR) {
gear.offerFirst(gear.pollLast());
} else if(clockDir == REVERSE_CLOCK_DIR){
gear.offerLast(gear.pollFirst());
}
}
}
'알고리즘' 카테고리의 다른 글
백준 2003번 수들의 합2 (JAVA) (0) | 2023.11.10 |
---|---|
백준 1107번 리모컨 (JAVA) (0) | 2023.11.09 |
백준 15683번 감시 (JAVA) (0) | 2023.11.07 |
백준 16234번 인구 이동 (JAVA) (3) | 2023.11.06 |
백준 1062번 가르침 (JAVA) (0) | 2023.11.05 |