문제
https://www.acmicpc.net/problem/14891
문제 개요
총 4개의 톱니바퀴가 일렬로 배치되어 있으며, 각 톱니바퀴는 N극(0)과 S극(1)으로 이루어진 8개의 톱니를 가지고 있습니다. 사용자는 톱니바퀴를 회전시킬 때, 서로 맞닿은 톱니의 극에 따라 다른 톱니바퀴도 영향을 받아 회전할 수 있습니다. 주어진 회전 명령에 따라 톱니바퀴를 회전시키고, 최종 상태를 기반으로 점수를 계산하는 문제입니다.
접근 방법
- 톱니바퀴 상태 및 회전 명령 초기화
- 4개의 톱니바퀴 상태를 2차원 배열로 저장하였습니다.
- 각 회전 명령은 번호와 방향을 담은 객체로 관리하였습니다.
- 회전 방향 결정
- 특정 톱니바퀴를 회전시키면, 맞닿은 톱니의 극(N극과 S극)을 확인하여 인접 톱니바퀴가 회전할지 여부를 결정했습니다.
- 이를 위해 회전 시작 톱니바퀴의 왼쪽과 오른쪽을 각각 탐색하며, 영향을 받는 톱니바퀴들의 회전 방향을 결정하였습니다.
- 톱니바퀴 회전 구현
- 시계 방향 회전과 반시계 방향 회전을 각각 함수로 구현하여, 결정된 회전 방향에 따라 배열을 수정하였습니다.
- 최종 점수 계산
- 각 톱니바퀴의 12시 방향 값에 따라 점수를 계산하였습니다. 톱니바퀴 번호에 따라 가중치(1, 2, 4, 8)를 적용하여 점수를 합산하였습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[][] cogs = new int[4][8]; // 톱니바퀴 배열
static List<Node> cmd = new ArrayList<>();
public static void main(String[] args) throws IOException {
init();
turnCog();
System.out.println(calCogState());
}
public static int calCogState() {
int answer = 0;
answer += cogs[0][0] == 1 ? 1 : 0;
answer += cogs[1][0] == 1 ? 2 : 0;
answer += cogs[2][0] == 1 ? 4 : 0;
answer += cogs[3][0] == 1 ? 8 : 0;
return answer;
}
public static void turnCog() {
for (Node command : cmd) {
int targetCog = command.num - 1;
int dir = command.dir;
int[] directions = new int[4];
directions[targetCog] = dir;
for (int i = targetCog - 1; i >= 0; i--) {
if (cogs[i][2] != cogs[i + 1][6]) {
directions[i] = -directions[i + 1];
} else {
break;
}
}
for (int i = targetCog + 1; i < 4; i++) {
if (cogs[i - 1][2] != cogs[i][6]) {
directions[i] = -directions[i - 1];
} else {
break;
}
}
for (int i = 0; i < 4; i++) {
if (directions[i] == 1) {
rotateClockwise(cogs[i]);
} else if (directions[i] == -1) {
rotateCounterClockwise(cogs[i]);
}
}
}
}
public static void rotateClockwise(int[] cog) {
int temp = cog[7];
for (int i = 7; i > 0; i--) {
cog[i] = cog[i - 1];
}
cog[0] = temp;
}
public static void rotateCounterClockwise(int[] cog) {
int temp = cog[0];
for (int i = 0; i < 7; i++) {
cog[i] = cog[i + 1];
}
cog[7] = temp;
}
public static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 4; i++) {
cogs[i] = br.readLine().chars().map(c -> c - '0').toArray();
}
int k = Integer.parseInt(br.readLine());
for (int i = 0; i < k; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
cmd.add(new Node(num, dir));
}
}
static class Node {
int num, dir;
public Node(int num, int dir) {
this.num = num;
this.dir = dir;
}
}
}
'문제 > 백준' 카테고리의 다른 글
[백준 / Java] 2467 용액 (1) | 2025.02.21 |
---|---|
[백준] 20437 문자열 게임 2 - Java (1) | 2025.01.27 |
[백준] 14890 경사로 - Java (1) | 2025.01.24 |
[백준] 14503 로봇 청소기 - Java (1) | 2025.01.19 |
[백준] 14499 주사위 굴리기 - Java (0) | 2025.01.18 |