문제
https://www.acmicpc.net/problem/15662
15662번: 톱니바퀴 (2)
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
혼자 못풀었다. 너무 어렵다. 알고리즘 내 사고 방식이 글러 먹은걸까? 진짜 내 힘으로 푸는 문제가 몇 안되는것같다. 짜증이난다.
풀이 접근법
12시 방향이 S인지 확인해야 하므로, 12시 방향에 어떠한 문자가 와있는지만 생각하면 된다.
즉 12시 방향에 현재 회전으로 인해 변화된 인덱스만 감지해주면 된다.
1. 회전하는 톱니의 포지션과 회전 방향을 입력받는다.
2. 회전하는 톱니를 기준으로 왼쪽 톱니, 오른쪽 톱니들이 각각 어느 방향으로 회전해야하는지 확인한다.
3. 어느 방향으로 회전하는지를 확인하기 위해선 각 톱니의 3번째 혹은 9번째 톱니의 값을 비교해준다.
4. 비교했을때, 값이 같은 경우 회전하지 않는 것으로 간주하고, 값이 다른경우 반대방향으로 회전하는 것으로 간주한다.
5. 모든 톱니의 회전 방향을 알게되면, 톱니를 회전시킨다.(12시 방향에 어떠한 인덱스가 오는지 기준)
6. 최종적으로 12시에 S가 오는지 확인한다.
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static Gear[] gears;
public static int T;
public static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
gears = new Gear[T];
for (int i = 0; i < T; i++) {
String[] s = br.readLine().split("");
gears[i] = new Gear(Arrays.stream(s).mapToInt(Integer::parseInt).toArray());
}
K = Integer.parseInt(br.readLine());
for (int i = 0; i < K; i++) {
StringTokenizer stk = new StringTokenizer(br.readLine());
int pos = Integer.parseInt(stk.nextToken()) - 1; // 인덱스
int dir = Integer.parseInt(stk.nextToken());
int[] roll = new int[T];
roll[pos] = dir; // 주어진 포지션 회전 방향
// 주어진 포지션을 기준으로 왼쪽 포지션
for (int j = pos - 1; j > -1; j--) {
Gear cur = gears[j];
Gear prev = gears[j + 1];
if (cur.getThree() == prev.getNine()) {
break;
} else {
roll[j] = -1 * roll[j + 1]; // 반대 방향으로 돌려
}
}
// 주어진 포지션을 기준으로 오른쪽 포지션
for (int j = pos + 1; j < T; j++) {
Gear cur = gears[j];
Gear prev = gears[j - 1];
if (prev.getThree() == cur.getNine()) {
break;
} else {
roll[j] = -1 * roll[j - 1];
}
}
// 돌려
for (int j = 0; j < roll.length; j++) {
if (roll[j] == -1) {
gears[j].rollLeft();
}
if (roll[j] == 1) {
gears[j].rollRight();
}
}
}
int count = 0;
for (int i = 0; i < T; i++) {
Gear cur = gears[i];
if (cur.getTwelve() == 1) { // 12시방향이 s인경우
count++;
}
}
System.out.println(count);
}
static class Gear {
// 12시 지점을 기준으로 두고 어떤 톱니바퀴가 오는지 확인
private int[] gear;
private int pos; // 12시 지점의 톱니바퀴
public Gear(int[] array) {
this.gear = array;
pos = 0;
}
public void rollRight() { // 톱니바퀴 오른쪽 회전
if (pos == 0) {
pos = 7;
} else {
pos -= 1;
}
}
public void rollLeft() { // 톱니바퀴 왼쪽 회전
pos = (pos + 1) % 8;
}
public int getThree() { // 세번째 값 받아오기
return gear[(pos + 2) % 8];
}
public int getNine() { // 아홉번째 값 받아오기
return gear[(pos + 6) % 8];
}
public int getTwelve() {
return gear[pos];
}
}
}
이러한 문제도 내 힘으로 풀지 못하는데,
카카오 코딩테스트는 어떻게 합격할까.. 한치앞도 안보인다.. 진짜
'Backend > 알고리즘' 카테고리의 다른 글
[백준] 14888번 - 연산자 끼워넣기 (0) | 2023.11.30 |
---|---|
[백준] 1911 - 흙길 보수하기 (1) | 2023.11.30 |
[백준] 17406 : 배열 돌리기 (1) | 2023.11.28 |
[백준] 3190번: 뱀 (0) | 2023.11.28 |
[카카오 기출 2018] 압축 (0) | 2023.11.25 |