백준 14891 톱니바퀴 (Java,자바)

jonghyukLee·2021년 10월 3일
0

이번에 풀어본 문제는
백준 14891번 톱니바퀴 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static HashMap<Integer,Integer> command;
    static List<Boolean> [] map;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String tmp_str;
        map = new LinkedList[5];
        for(int i = 0; i < 5; ++i) map[i] = new LinkedList<>();

        boolean tmp_bool;
        for(int i = 1; i < 5; ++i)
        {
            tmp_str = br.readLine();

            for(int j = 0; j < 8; ++j)
            {
                tmp_bool = tmp_str.charAt(j)-'0' > 0;
                map[i].add(tmp_bool);
            }
        }

        int t = Integer.parseInt(br.readLine());
        StringTokenizer st;
        int num,dir;

        for(int i = 0; i < t; ++i)
        {
            st = new StringTokenizer(br.readLine());
            num = Integer.parseInt(st.nextToken());
            dir = Integer.parseInt(st.nextToken());
            command = new HashMap<>();
            command.put(num,dir);
            check(num,dir);
            for(int key : command.keySet())
            {
                rotate(key,command.get(key));
            }
        }

        int tmp_num = 1;
        int res = 0;
        for(int i = 1; i < 5; ++i)
        {
            if(map[i].get(0)) res+= tmp_num;
            tmp_num *= 2;
        }

        System.out.print(res);
    }
    static void check(int num, int dir)
    {
        if(num-1 > 0 && !command.containsKey(num-1)) // 왼쪽
        {
            if(map[num-1].get(2) != map[num].get(6))
            {
                command.put(num-1,dir*-1);
                check(num-1,dir*-1);
            }
        }
        if(num+1 < 5 && !command.containsKey(num+1)) // 오른쪽
        {
            if(map[num+1].get(6) != map[num].get(2))
            {
                command.put(num+1,dir*-1);
                check(num+1,dir*-1);
            }
        }
    }
    static void rotate(int num, int dir)
    {
        if(dir == 1) map[num].add(0,map[num].remove(7));

        else map[num].add(map[num].remove(0));
    }
}

📝 풀이

입력이 주어졌을때, 인접한 톱니바퀴를 순차적으로 회전시키는 문제입니다.
양 옆 톱니바퀴의 N극, S극을 비교하여 서로 반대되는 극이라면 반대방향으로 회전시켜주면 됩니다.
주어진 조건이 바로바로 회전하는 것이 아니기 때문에 입력된 명령에 따라 check함수를 호출하여 탐색을 시작한 후, 해시맵(command)에 톱니바퀴의 번호와 회전방향을 각각 key,value로 기록해줍니다. 키값을 방문 배열로 활용하여, 이미 삽입 완료된 번호라면 넘어갈 수 있도록 하였습니다.
check함수의 재귀호출이 끝나게 되면 입력에 대한 회전세트가 완성되며, rotate함수를 통해 각 톱니바퀴 번호에 맞게 회전을 진행해줍니다.
마지막으로 주어진 조건에 맞는 점수배점을 매겨주면 해결됩니다.

📜 후기

문제 조건이 조금 헷갈려서 이해하는데 시간이 걸렸지만, 다행히 구현은 어렵지 않아 금방 풀어낼 수 있었습니다!^^

profile
머무르지 않기!

0개의 댓글