[SWEA] 4013. 특이한 자석
문제 링크
풀이 과정
기준 idx와 dir을 중심으로 좌, 우로 돌릴 수 있는 톱니바퀴의 idx, dir을 리스트에 저장해 두었다가 동시에
돌려야 한다는 점을 적용해야 문제를 해결할 수 있습니다.
코드
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int TC = sc.nextInt();
for (int tc = 1; tc <= TC; tc++) {
int K = sc.nextInt();
int[][] magnet = new int[4][8];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
magnet[i][j] = sc.nextInt();
}
}
for (int k = 0; k < K; k++) {
int idx = sc.nextInt() - 1;
int dir = sc.nextInt();
int tmpIdx = idx;
int tmpDir = dir;
List<Pair> rebuildList = new ArrayList<>();
rebuildList.add(new Pair(idx, dir));
// 왼쪽
while (tmpIdx > 0) {
if (magnet[tmpIdx][6] == magnet[tmpIdx - 1][2]) {
break;
}
tmpDir = tmpDir == 1 ? 0 : 1;
rebuildList.add(new Pair(tmpIdx - 1, tmpDir));
tmpIdx--;
}
tmpIdx = idx;
tmpDir = dir;
// 오른쪽
while (tmpIdx < 3) {
if (magnet[tmpIdx][2] == magnet[tmpIdx + 1][6]) {
break;
}
tmpDir = tmpDir == 1 ? 0 : 1;
rebuildList.add(new Pair(tmpIdx + 1, tmpDir));
tmpIdx++;
}
rebuild(magnet, rebuildList);
}
int ans = 0;
ans += magnet[0][0] == 1 ? 1 : 0;
ans += magnet[1][0] == 1 ? 2 : 0;
ans += magnet[2][0] == 1 ? 4 : 0;
ans += magnet[3][0] == 1 ? 8 : 0;
System.out.println("#" + tc + " " + ans);
}
}
public static void rebuild(int[][] magnet, List<Pair> rebuildList) {
for (Pair p : rebuildList) {
int idx = p.idx;
int dir = p.dir;
// 시계 방향
if (dir == 1) {
int tmp = magnet[idx][7];
for (int i = 6; i >= 0; i--) {
magnet[idx][i + 1] = magnet[idx][i];
}
magnet[idx][0] = tmp;
}
// 반시계 방향
else {
int tmp = magnet[idx][0];
for (int i = 1; i <= 7; i++) {
magnet[idx][i - 1] = magnet[idx][i];
}
magnet[idx][7] = tmp;
}
}
}
public static class Pair {
int idx;
int dir;
public Pair(int idx, int dir) {
this.idx = idx;
this.dir = dir;
}
}
}
댓글남기기