알고리즘/문제 풀이

[Java/자바 swea 4013] 특이한 자석

광규니 2021. 10. 1. 15:50
반응형

풀이

처음 스택을 쓰려고 했는데 엄청 복잡했습니다...

 

그래서 2차원 배열을 통해 구현했습니다.

map 4x8 2차원 형태로 저장하구 , arr에 시계면 1, 반시계면 -1, 회전 하지않는다면 0 으로 담았습니다.

 

받은 인덱스 값을 바탕으로 왼쪽,오른쪽을 나눈 뒤

오른쪽일 땐, map[idx][6]번과 map[idx-1][2] 을 비교해준 뒤 값을 arr 를 넣어주고

왼쪽도 비슷한 로직으로 arr 넣어줍니다.

 

arr를 기준으로

시계,반시계로 돌려줍니다

시계방향은 끝에 있는 값을 처음으로 넣어줍니다.

반시계방향은 처음 값을 마지막으로 넣어줍니다.

 

풀이 완료!!

import java.io.*;
import java.util.*;

public class Solution {
	static int[][] map;
	static int[] arr; 
	
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int tc=Integer.parseInt(br.readLine());
		for(int t=1 ; t<=tc ; t++) {
			map = new int[4][8];
			
		
			int k= Integer.parseInt(br.readLine());
			
			for(int i=0; i<4; i++) {
				st=new StringTokenizer(br.readLine());
				for(int j=0; j<8; j++) {
					map[i][j]=Integer.parseInt(st.nextToken());
				}
			}
			
			for(int i=0; i<k ; i++) {
				arr= new int[4];
				st = new StringTokenizer(br.readLine(), " ");
				int idx =Integer.parseInt(st.nextToken())-1;
				int dir=Integer.parseInt(st.nextToken());
				do_rotate(idx,dir);
			}
			
			int total=0;
			
			if(map[0][0]==1) total+=1;
			if(map[1][0]==1) total+=2;
			if(map[2][0]==1) total+=4;
			if(map[3][0]==1) total+=8;
			System.out.println("#"+t+" "+total);
			
		}
	}

	private static void do_rotate(int idx, int dir) {
		// TODO Auto-generated method stub
		arr[idx]=dir;
		
		// 오른쪽
		for(int i=idx+1 ; i<4 ; i++) {
			if(map[i][6]==map[i-1][2]) {
				break;
			}
			else arr[i]= -arr[i-1];
		}
		
		//왼쪽
		for(int i=idx-1 ; i>=0 ; i--) {
			if(map[i+1][6] == map[i][2]) {
				break;
			}
			else arr[i] = -arr[i+1];
		}
		
		// 돌리기
		for(int i=0; i<4; i++) {
			if(arr[i]==0) continue;
			// 시계
			else if(arr[i] == 1) {
				int tmp=map[i][7];
				for(int j=7 ; j>0 ;j--) {
					map[i][j]=map[i][j-1];
				}
				map[i][0]=tmp;
			}
			// 반시계
			
			else if(arr[i] == -1) {
				
				int tmp=map[i][0];
				for(int j=0; j<7 ; j++) {
					map[i][j]=map[i][j+1];
				}
				map[i][7]=tmp;
			}
		}
		
	}


}

인덱스 값을 헷갈리지 않게 조심합시다!!

반응형