boj14891: 톱니바퀴

2025. 6. 1. 21:45·Algorithm/백준

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

 

접근 방법

기존에 4개의 톱니바퀴를 어떤 자료구조로 저장할지 고민하고, 이동시키는게 상대적으로 편한 리스트를 고민했으나 다른 사람들의 풀이를 참고하여 2차원배열이 훨씬 편한것을 확인했다. 시계 방향, 반시계 방향도 생각보다 이동시키기 쉽다.

 

움직이는 톱니바퀴를 찾고, 해당 톱니바퀴의 왼쪽 및 오른쪽을 순회하며 움직이는 경우엔 현재 방향에서 -1을 곱해주고 아닌 경우엔 멈췄다는 의미이므로 탐색을 중지했다. 4개 톱니바퀴의 이동 방향을 저장해둔 다음에, 시계 방향 및 반시계 방향에 따라서 재배열을 진행하면 되는 문제였다.

 

코드

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

public class boj14891 {
    static int [][] wheels = new int[4][8];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for(int i = 0; i < 4; i++) {
            String input = br.readLine();
            for(int j = 0; j < 8; j++) {
                wheels[i][j] = input.charAt(j) - '0';
            }
        }

        int k = Integer.parseInt(br.readLine());
        for(int i = 0; i < k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int target = Integer.parseInt(st.nextToken());
            int dir = Integer.parseInt(st.nextToken());

            target -= 1;
            int [] arr = new int[4];
            arr[target] = dir;

            for(int j = target - 1; j >= 0; j--) { // 왼쪽 방향으로
                if (wheels[j+1][6] != wheels[j][2]) { // 만약에 방향이 다르다면 반대로 회전
                    arr[j] = arr[j+1] * -1;
                }
                else break; // 움직이지 않는다면 고정
            }

            for(int j = target; j < 3; j++) {
                if (wheels[j][2] != wheels[j+1][6]) {
                    arr[j+1] = arr[j] * -1;
                }
                else break;
            }

            for(int j = 0; j < 4; j++) {
                if (arr[j] == 1) wheels[j] = turnRight(j);
                else if (arr[j] == -1) wheels[j] = turnLeft(j);
            }

//            for(int j = 0; j < 4; j++) {
//                for(int t = 0; t < 8; t++) {
//                    System.out.print(wheels[j][t]);
//                }
//                System.out.println();
//            }
        }
        System.out.println(getScore());
    }

    public static int getScore() {
        int score = 0;
        if (wheels[0][0] == 1) score += 1;
        if (wheels[1][0] == 1) score += 2;
        if (wheels[2][0] == 1) score += 4;
        if (wheels[3][0] == 1) score += 8;
        return score;
    }

    // 01111101
    // 1 0111110
    public static int[] turnRight(int target) { // 1일때 시계방향 회전
        int[] tmp = new int[8];
        for(int i = 1; i < 8; i++) { //
            tmp[i] = wheels[target][i-1];
        }
        tmp[0] = wheels[target][7];
        return tmp;
    }

    // 01111101
    // 1111101 0
    public static int[] turnLeft(int target) { // -1일때 역방향 회전
        int[] tmp = new int[8];
        for(int i = 0; i < 7; i++) {
            tmp[i] = wheels[target][i+1];
        }
        tmp[7] = wheels[target][0];
        return tmp;
    }
}

'Algorithm > 백준' 카테고리의 다른 글

2차원 배열에서 회전  (0) 2025.06.22
연산자 끼워넣기, 스타트와 링크  (1) 2025.06.03
[백준] 감시  (1) 2025.05.25
boj21939: 문제 추천 시스템 Version 1  (1) 2025.05.15
boj13904: 과제  (2) 2025.05.15
'Algorithm/백준' 카테고리의 다른 글
  • 2차원 배열에서 회전
  • 연산자 끼워넣기, 스타트와 링크
  • [백준] 감시
  • boj21939: 문제 추천 시스템 Version 1
미네구스
미네구스
  • 미네구스
    망구스 blog
    미네구스
  • 전체
    오늘
    어제
    • 분류 전체보기 (175)
      • Kotlin (0)
      • 시큐리티 (0)
        • 개발자 유미 (0)
      • 배포 (4)
      • 회고 (0)
      • Algorithm (143)
        • 프로그래머스 코딩테스트 문제풀이전략 (37)
        • 백준 (66)
        • 프로그래머스 (18)
        • Leetcode (22)
        • 코테 팁 (0)
      • 프로젝트 (8)
        • WEPIK (3)
        • PICK-O (5)
      • CS (1)
        • 운영체제 (5)
        • 네트워크 (1)
        • 면접스터디 (2)
      • 면접 (1)
        • 코테후기 (0)
        • 면접후기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    `
    백트래킹
    N과 M
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
미네구스
boj14891: 톱니바퀴
상단으로

티스토리툴바