Dev.baelanche

[백준 14891] 톱니바퀴 본문

Data Structure & Algorithm/PS - JAVA

[백준 14891] 톱니바퀴

baelanche 2019. 6. 24. 21:38
반응형

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

 

문제가 너무 길어 링크로 대체하겠다.

 

연속으로 시뮬레이션 문제를 풀었다.

삼성 역량 평가 문제들은 알고리즘 지식 보다 문제해결능력에 더 초점이 맞춰져 있는 것 같다.

 

 

시뮬레이션 문제답게 이 문제 역시 문제에서 요구한대로만 잘 풀면된다.

시계, 반시계방향 회전 로직, 양 옆의 톱니바퀴 회전 로직만 구현해내면 끝이다.

 

필자는 재귀와 방문배열의 활용으로 풀었다.

 

public class Main {
    
    static int a[][] = new int[5][9];
    static boolean visited[] = new boolean[5];
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        for(int i=1; i<=4; i++) {
            String s = br.readLine();
            for(int j=1; j<=8; j++)
                a[i][j] = s.charAt(j-1) - '0';
        }
        
        int k = Integer.parseInt(br.readLine());
        while(k-->0) {
            st = new StringTokenizer(br.readLine());
            int idx = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken());
            
            visited[idx] = true;
            rotate(idx, d);
            
            Arrays.fill(visited, false);
        }
        
        int score = 0;
        for(int i=1; i<=4; i++)
            if(a[i][1] == 1)
                score += Math.pow(2, i-1);
        
        System.out.println(score);
    }
    
    public static void rotate(int idx, int d) {
        if(idx - 1 > 0 && !visited[idx-1])
            if(a[idx-1][3] != a[idx][7]) {
                visited[idx-1] = true;
                rotate(idx-1, -d);
            }
        
        if(idx + 1 < 5 && !visited[idx+1])
            if(a[idx][3] != a[idx+1][7]) {
                visited[idx+1] = true;
                rotate(idx+1, -d);
            }
        
        int prev = a[idx][1];
        int curr = 0;
        if(d == 1) {
            for(int i=2; i<=8; i++) {
                curr = a[idx][i];
                a[idx][i] = prev;
                prev = curr;
            }
        } else {
            for(int i=8; i>=2; i--) {
                curr = a[idx][i];
                a[idx][i] = prev;
                prev = curr;
            }
        }
        a[idx][1] = curr;
    }
}
반응형

'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글

[백준 15686] 치킨 배달  (0) 2019.06.25
[백준 17142] 연구소 3  (0) 2019.06.25
[백준 16235] 나무 재테크  (0) 2019.06.24
[백준 13458] 시험 감독  (0) 2019.06.24
[백준 17143] 낚시왕  (0) 2019.06.24
Comments