Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
관리 메뉴

Life Engineering

[SWEA 4013] 특이한 자석 (Java) 본문

Problem Solving

[SWEA 4013] 특이한 자석 (Java)

흑개 2022. 4. 13. 10:16

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH&categoryId=AWIeV9sKkcoDFAVH&categoryType=CODE&problemTitle=4013&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

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

public class Solution_SWEA_4013 {
	static int T, K;
	static int[][] magnetics;
	static int[] arrows;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=null;
		T=Integer.parseInt(br.readLine());
		for (int t=1; t<=T; t++) {
			magnetics=new int[4][8];
			arrows=new int[4];
			K=Integer.parseInt(br.readLine());
			for (int i=0; i<4; i++) {
				st=new StringTokenizer(br.readLine());
				for (int j=0; j<8; j++) {
					magnetics[i][j]=Integer.parseInt(st.nextToken());
				}
			}
			for (int i=0; i<K; i++) {
				st=new StringTokenizer(br.readLine());
				int num=Integer.parseInt(st.nextToken())-1;
				int dir=Integer.parseInt(st.nextToken());
				int[] results=new int[4];
				dfs(num, dir, results, new boolean[4]);
				for (int j=0; j<4; j++) {
					if (results[j]!=0) rotates(j, results[j]);
				}
			}
			int answer=0;
			int score=1;
			for (int i=0; i<4; i++) {
				if (magnetics[i][arrows[i]]==1) answer+=score;
				score*=2;
			}
			System.out.println("#"+t+" "+answer);
		}

	}

	private static void dfs(int num, int dir, int[] results, boolean[] visited) {
		results[num]=dir;
		visited[num]=true;
		//왼
		int left=num-1;
		if (left>=0 && !visited[left]) {
			int e1=(arrows[left]+2)%8;
			int e2=(arrows[num]+6)%8;
			if (magnetics[left][e1]!=magnetics[num][e2]) {
				dfs(left, -1*dir, results, visited);
			}
		}
		//오
		int right=num+1;
		if (right<4 && !visited[right]) {
			int e1=(arrows[right]+6)%8;
			int e2=(arrows[num]+2)%8;
			if (magnetics[right][e1]!=magnetics[num][e2]) {
				dfs(right, -1*dir, results, visited);
			}
		}
		
	}

	private static void rotates(int num, int dir) {	//arrow의 위치를 이동시켜줌
		if (dir==1) {
			arrows[num]=(arrows[num]+7)%8;
		}
		else if (dir==-1) {
			arrows[num]=(arrows[num]+1)%8;
		}
		
	}
}

회전을 arrow의 위치를 이동시켜주는 걸로 대체했다. 

시계방향으로 회전일 경우=> (위치+7)%8 

시계 반대방향으로 회전일 경우=>(위치+1)%8 로 회전한다.

 

서로 맞부딪히는 날의 위치는 arrow의 위치로부터 +2, -2 이다.

 

DFS로 풀이하여, 방문하지 않은 톱니바퀴와 서로 다른 날을 가진 톱니바퀴일 경우 탐색하여 회전 결과를 나타내는 results 배열에 저장하여 준다.