[BOJ] 14891. 톱니바퀴

Hyodong Lee·2022년 2월 28일
0

알고리즘

목록 보기
18/32

[작성일]

  • 2022-03-01

[분류]

  • 구현


[문제링크]

[요구사항]

  • 톱니바퀴를 K번 돌린 이후 점수를 구하라.


[풀이]

단순 구현문제라는 생각이 들었다.
우선, 톱니바퀴를 string 형태로 모두 받고 K번 회전을 반복한 뒤, 점수계산하는 방식으로 큰 로직을 작성했다.
톱니바퀴를 돌리는 부분을 구현하는 부분은 2부분으로 나누었다.
1) 돌려야할 톱니바퀴를 체크한다.
2) 돌린다.

그대로 구현을 하였다.


[코드]

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

public class Main {
    static String[] cycle = new String[4];
    static int K;

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

        // 톱니바퀴를 string 형태로 모두 받기
        for (int i = 0; i < 4; i++) {
            cycle[i] = br.readLine();
        }

        K = Integer.parseInt(br.readLine());
        int idx, mode;
        // K번 회전
        while (K-- > 0) {
            st = new StringTokenizer(br.readLine());
            idx = Integer.parseInt(st.nextToken());
            mode = Integer.parseInt(st.nextToken());

            turn(idx - 1, mode);
        }

        // 점수계산
        System.out.println((cycle[0].charAt(0) - '0') + 2 * (cycle[1].charAt(0) - '0') + 4 * (cycle[2].charAt(0) - '0') + 8 * (cycle[3].charAt(0) - '0'));
    }

    public static void turn(int start, int mode) {
        // 돌아가야하는 톱니바퀴부터 체크
        int[] isTurn = new int[4];
        isTurn[start] = mode;
        int idx = start;
        while (++idx < 4) {
            if (cycle[idx - 1].charAt(2) == cycle[idx].charAt(6)) {
                break;
            } else {
                isTurn[idx] = -isTurn[idx - 1];
            }
        }
        idx = start;
        while (--idx >= 0) {
            if (cycle[idx + 1].charAt(6) == cycle[idx].charAt(2)) {
                break;
            } else {
                isTurn[idx] = -isTurn[idx + 1];
            }
        }

        // 톱니바퀴 회전
        for (int i = 0; i < 4; i++) {
            if (isTurn[i] == 1) {
                // 시계방향
                cycle[i] = cycle[i].charAt(7) + cycle[i].substring(0, 7);
            } else if (isTurn[i] == -1) {
                // 반시계방향
                cycle[i] = cycle[i].substring(1, 8) + cycle[i].charAt(0);
            }
        }
    }
}

profile
사용자가 신뢰할 수 있는 튼튼한 서비스 개발을 지향하는 예비 개발자입니다.

0개의 댓글