유블로그

[Java] swea 4013 특이한 자석 본문

알고리즘

[Java] swea 4013 특이한 자석

yujeong kang 2021. 4. 17. 17:00

[Java] swea 4013 특이한 자석

 

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH&categoryId=AWIeV9sKkcoDFAVH&categoryType=CODE&problemTitle=sw&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.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class 모의SW_4013_특이한자석 {
	static int K;
	static int[][] magnet = new int[5][8];
	static int[][] rotation;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int T = Integer.parseInt(br.readLine());
		for (int testcase = 1; testcase <= T; testcase++) {
			K = Integer.parseInt(br.readLine());
			rotation = new int[K][2];

			for (int i = 1; i <= 4; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for (int j = 0; j < 8; j++) {
					magnet[i][j] = Integer.parseInt(st.nextToken());
				}
			}

			for (int i = 0; i < K; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for (int j = 0; j < 2; j++) {
					rotation[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			System.out.println("#" + testcase + " " + solve());
		} // tc

	} // main

	private static int solve() {
		
		for (int i = 0; i < K; i++) {
			List<int[]> rotateMag = new ArrayList<>();
			int me = rotation[i][0];	// 현재회전되는자석번호
			int dir = rotation[i][1];	// 1이면 시계, -1이면 반시계
			
			rotateMag.add(new int[] {me, dir});
			int idx = me;
			int newDir = dir;
			while(true) {
				if(idx-1 < 1) break;
				if(magnet[idx][6] != magnet[idx-1][2]) {
					newDir *= -1;
					rotateMag.add(new int[] {idx-1, newDir});
				}
				else break;
				idx--;
			}
			
			idx = me;
			newDir = dir;
			while(true) {
				if(idx+1 == 5) break;
				if(magnet[idx][2] != magnet[idx+1][6]) {
					newDir *= -1;
					rotateMag.add(new int[] {idx+1, newDir});
				}
				else break;
				idx++;
			}
			
			// 회전정보 모았고 이제 실제로 회전
			for(int[] arr : rotateMag) {
				int num = arr[0];
				
				if(arr[1] == 1) {	// 회전방향이 시계면 오른쪽으로 회전
					int tmp = magnet[num][7];
					for (int k = 7; k >= 1; k--) {
						magnet[num][k] = magnet[num][k-1];
					}
					magnet[num][0] = tmp;
				}
				else {
					int tmp = magnet[num][0];
					for (int k = 0; k < 7; k++) {
						magnet[num][k] = magnet[num][k+1];
					}
					magnet[num][7] = tmp;
				}
			}
			
		} // K
		
		int sum = 0;
		int score = 1;
		for (int i = 1; i <= 4; i++) {
			if(magnet[i][0] == 1) {
				sum += score;
			}
			score *= 2;
		}
		
		return sum;
	} // solve
}

 

자신의 6번 날은 나의 왼쪽 자물쇠 2번 날과 닿아있고 자신의 2번 날은 나의 오른쪽 자물쇠 6번 날과 닿아있는 
규칙을 생각했다.

2번 자물쇠가 회전해야하는 차례라면,
왼쪽부터
2번자물쇠 6번날과 1번자물쇠 2번을 체크하여 자성이 다르면 회전정보에 추가한다.

그 다음 오른쪽,
2번자물쇠 2번날과 3번자물쇠 6번을 체크하여 자성이 다르면 회정정보에 추가한다.
3번이 회전해야한다면 추가로 4번까지 확인하고,
3번이 회전하지 않는다면 4번까지 확인할 필요가 없다.

이런식으로 한 번 회전할 때 회전해야하는 자물쇠들을 기억해놓고
체크가 끝나면 한번에 배열을 오른쪽 혹은 왼쪽으로 rotate 하면 된다.

'알고리즘' 카테고리의 다른 글

[Java] swea 2112 보호필름  (0) 2021.04.19
[Java] swea 4014 활주로 건설  (0) 2021.04.17
[Java] swea 4012 요리사  (0) 2021.04.17
[Java] swea 4008 숫자만들기  (0) 2021.04.17
[Java] BOJ 20058 마법사 상어와 파이어 스톰  (0) 2021.04.16