Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

자르비 왕국

[SW Academy] 4014 특이한 자석 - JAVA 본문

문제풀이

[SW Academy] 4014 특이한 자석 - JAVA

자르비옹스 2022. 4. 15. 02:10

1. 문제 유형 : 구현

 

자석이 회전할 때, 자석의 상태를 저장하는 배열을 회전하는 대신 각 자석의 빨간색 화살표의 위치를 저장한 배열을 생성하고, 빨간색 화살표의 위치를 변경한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Solution {
	
	public static int K, magnet[][], pos[];

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(in.readLine());
		StringBuilder sb = new StringBuilder();
		for (int tc = 1; tc <= T; tc++) {
			K = Integer.parseInt(in.readLine());
			magnet = new int[4][8];
			pos = new int[4];	// 빨간색 화살표 위치
			StringTokenizer st = null;
			for (int i = 0; i < 4; i++) {
				st = new StringTokenizer(in.readLine());
				for (int j = 0; j < 8; j++) {
					magnet[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			for (int i = 0; i < K; i++) {
				st = new StringTokenizer(in.readLine());
				int N = Integer.parseInt(st.nextToken())-1;
				int D = Integer.parseInt(st.nextToken());
				boolean[] visited = new boolean[4];
				
				Queue<int[]> queue = new LinkedList<int[]>();
				queue.add(new int[] { N, D });	// 번호, 방향
				
				while(!queue.isEmpty()) {
					int[] current = queue.poll();
					int num = current[0];
					int dir = current[1];
					int idx = pos[num];	// 빨간색 화살표 위치
					if(num > 0) {
						// 왼쪽 마그넷 존재
						if(!visited[num-1] && magnet[num][((idx-2)+8)%8] != magnet[num-1][(pos[num-1]+2)%8]) {
							// 위치 조정할 마그넷 넣기
							queue.add(new int[] {num-1, -dir});
						}
					}
					if(num < 3) {
						// 오늘쪽 마그넷 존재
						if(!visited[num+1] && magnet[num][(idx+2)%8] != magnet[num+1][(pos[num+1]-2+8)%8]) {
							queue.add(new int[] {num+1, -dir});
						}
					}
					// 현재 마그넷 회전
					pos[num] = ((pos[num]-dir)%8+8)%8;
					visited[num] = true;
				}
			}
			
			int answer = 0;
			for (int i = 0; i < 4; i++) {
				if(magnet[i][pos[i]] == 1) answer += Math.pow(2, i);
			}
			sb.append("#").append(tc).append(" ").append(answer).append("\n");
		}
		System.out.println(sb);
	}

}