코드굽는 타자기

SWEA[4013] - 특이한 자석 본문

알고리즘/Simulation

SWEA[4013] - 특이한 자석

bright-jun 2020. 2. 20. 09:44

링크

SWEA[4013]

문제설명

  • 시뮬레이션

문제풀이

  • 시뮬레이션
  • 도는 톱니 기준->자성체크->어디로도는지 정하고->돌림

문제코드

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

public class Solution {

    public static void rotate1(LinkedList<Integer> t) {
        int temp = t.peekLast();
        t.removeLast();
        t.addFirst(temp);
    }

    public static void rotate2(LinkedList<Integer> t) {
        int temp = t.peekFirst();
        t.removeFirst();
        t.addLast(temp);
    }

    public static void rotate(LinkedList<Integer> t, int dir) {
        if(dir==1) {
            rotate1(t);
        }
        else if(dir==-1){
            rotate2(t);
        }
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        //System.setIn(new FileInputStream("res/swea/4013.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T=Integer.parseInt(br.readLine());
        for (int test_case = 1; test_case <= T; test_case++) {
            int ans=0;
            int K = Integer.parseInt(br.readLine());

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

            int[] rotation = new int[4];

            for (int oper = 0; oper < K; oper++) {
                st = new StringTokenizer(br.readLine());
                int num = Integer.parseInt(st.nextToken())-1; 
                int dir = Integer.parseInt(st.nextToken()); 
                int ndir = dir;

                rotation = new int[4];
//                일단 타겟 체크
                rotation[num]=dir;
//                도는지 체크
//                우로 체크
                for (int i = 0; i < 3; i++) {
                    if(num+i+1>3)break;
//                    하나의 자석이 1 칸 회전될 때, 붙어 있는 자석은 서로 붙어 있는 날의 자성이 다를 경우에만 반대 방향으로 1 칸 회전된다.
                    if(rotation[num+i]!=0 && top[num+i].get(2)!=top[num+i+1].get(6)) {
                        ndir*=-1;
                        rotation[num+i+1]=ndir;
                    }
                    else {
                        rotation[num+i+1]=0;
                        break;
                    }
                }

                ndir = dir;
//                좌로 체크
                for (int i = 0; i < 3; i++) {
                    if(num-i-1<0)break;
//                    하나의 자석이 1 칸 회전될 때, 붙어 있는 자석은 서로 붙어 있는 날의 자성이 다를 경우에만 반대 방향으로 1 칸 회전된다.
                    if(rotation[num-i]!=0 && top[num-i].get(6)!=top[num-i-1].get(2)) {
                        ndir*=-1;
                        rotation[num-i-1]=ndir;
                    }
                    else {
                        rotation[num-i-1]=0;
                        break;
                    }
                }

//                rotation기준으로 돌리기
                for (int i = 0; i < 4; i++) {
                    rotate(top[i],rotation[i]);
                }
            }//oper end

//                0:N극 1:S극
            int temp=1;
            for (int i = 0; i < 4; i++) {
                if(top[i].get(0)==1) {
                    ans+=temp;
                }
                temp*=2;
            }

            System.out.println("#"+test_case+" "+ans);
            /*
             * 초기화
             */
        }//end test_case
    }//end main
}//end class

아쉬운점

  • Index 실수
    • 자석은 1번부터 시작함 index오류
    • 오른쪽 탐색은 [num+i]
      • 왼쪽탐색은 [num-i] 했어야하는데 +로함
  • 문제 제대로 안읽음
    • 돌고나서 도는건줄알았음
    • 돌때 같이돔

잘한점

  • rotate 메서드 생성
  • rotate 효율적으로 하기 위해 LinkedList 사용

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

SWEA[2477] - 차량 정비소  (0) 2020.02.22
SWEA[5658] - 보물상자 비밀번호  (0) 2020.02.20
SWEA[5650] - 핀볼 게임  (0) 2020.02.19
SWEA[5656] - 벽돌 깨기  (1) 2020.02.19
SWEA[1240] - 단순 2진 암호코드[D3]  (0) 2020.02.17
Comments