전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 14891 톱니바퀴 [Java]

2022. 3. 14. 03:09

BOJ 14891 톱니바퀴

1. 문제 링크

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

2. 문제 해설

구현 문제이다. 문제를 본 후 든 생각은 톱니바퀴 1개를 돌리는 메서드와, 돌린 1개의 톱니바퀴를 기준으로 전체 톱니바퀴를 돌리는 메서드를 구현해주면 해결할 수 있겠다는 것이었다. 2가지 메서드를 구현하면서 생각했던 점을 적어보겠다.

1. 톱니바퀴 1개를 돌리는 메서드
아래 코드에서 72~88번째 줄의 코드이다. 몇 번째 톱니바퀴를 돌릴지, 어떤 방향으로 돌릴지 알아야하므로 인자로 받는다.
시계 방향이든 반시계 방향이든 결국 한칸씩 옆으로 옮기는 것이다. 그러므로 기존 톱니바퀴와 정보가 똑같은 임시 톱니바퀴 배열을 만들어 이용해준다. 시계 방향일때와 반시계 방향일때 처리해주는 방식이 헷갈린다면 그림을 그려서 해보면 쉽게 이해할 수 있다.

2. 전체 톱니바퀴를 돌리는 메서드
1번 메서드를 이용해서 전체 톱니바퀴를 돌릴 것이다. 그러려면 4개의 톱니바퀴의 방향을 다 알아야한다. 4개의 톱니바퀴의 방향을 담는 gearDir 배열을 만들어주자. 인자로 받는 num과 dir는 처음에 돌려준 톱니바퀴의 번호와 방향이다.
처음에 돌려주는 톱니바퀴를 기준으로 오른쪽으로 톱니바퀴들을 살펴보면서 맞닿는 톱니가 다르면 방향을 직전 톱니바퀴의 반대로 바꿔준다. 만약 맞닿는 톱니가 동일하다면 톱니바퀴 방향은 초기에 초기화된 상태 그대로 0이다. 그리고 그 이후의 톱니바퀴들도 회전하지 않으므로 0이다.
같은 방식으로 처음에 돌려주는 톱니바퀴를 기준으로 왼쪽으로도 톱니바퀴들을 살펴보면서 방향들을 처리해준다.
4개의 톱니바퀴 방향을 다 정해줬으니 4개를 돌면서 1번 메서드를 이용하여 돌려주면 된다.

3. 코드 보기

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

public class Main {
    static int k;
    static int[][] gear; // gear[i][j] -> i번째 톱니바퀴의 j번째 톱니의 극 정보
    static int ans = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        gear = new int[4][8];

        for (int i = 0; i < 4; i++) {
            String[] gearInfo = br.readLine().split("");

            for (int j = 0; j < 8; j++) {
                gear[i][j] = Integer.parseInt(gearInfo[j]);
            }
        }

        k = Integer.parseInt(br.readLine());

        while (k-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int gearNum = Integer.parseInt(st.nextToken()) - 1;
            int dir = Integer.parseInt(st.nextToken());

            rotateAllGear(gearNum, dir);
        }

        for (int i = 0; i < 4; i++) {
            if (gear[i][0] == 1) {
                ans += Math.pow(2, i);
            }
        }

        bw.write(Integer.toString(ans));
        br.close();
        bw.flush();
        bw.close();
    }

    static void rotateAllGear(int num, int dir) {
        int[] gearDir = new int[4];
        gearDir[num] = dir;

        for (int i = num; i < 3; i++) {
            if (gear[i][2] != gear[i + 1][6]) {
                gearDir[i + 1] = -1 * gearDir[i];
            }
        }

        for (int i = num; i > 0; i--) {
            if (gear[i][6] != gear[i - 1][2]) {
                gearDir[i - 1] = -1 * gearDir[i];
            }
        }

        for (int i = 0; i < 4; i++) {
            if (gearDir[i] == 0) { // 기어의 회전 방향이 0이면 회전하지 않는 기어임
                continue;
            }

            rotateOneGear(i, gearDir[i]);
        }
    }

    static void rotateOneGear(int num, int dir) {
        int[] tmp = new int[8];

        for (int i = 0; i < 8; i++) {
            tmp[i] = gear[num][i];
        }

        if (dir == 1) { // 시계 방향
            for (int i = 0; i < 8; i++) {
                gear[num][i] = tmp[(i + 7) % 8];
            }
        } else if (dir == -1) { // 반시계 방향
            for (int i = 0; i < 8; i++) {
                gear[num][(i + 7) % 8] = tmp[i];
            }
        }
    }
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 15685 드래곤 커브 [Java]  (0) 2022.04.06
BOJ 14499 주사위 굴리기 [Java]  (0) 2022.03.19
BOJ 2457 공주님의 정원 [Java]  (0) 2022.03.03
BOJ 9663 N-Queen [Java]  (0) 2022.02.13
BOJ 11559 Puyo Puyo [Java]  (0) 2022.02.09
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 15685 드래곤 커브 [Java]
    • BOJ 14499 주사위 굴리기 [Java]
    • BOJ 2457 공주님의 정원 [Java]
    • BOJ 9663 N-Queen [Java]
    모달조아
    모달조아

    티스토리툴바