[백준] 14891 - 톱니바퀴 (JAVA)

개츠비·2023년 4월 7일
0

백준

목록 보기
59/84
  1. 소요시간 : 1시간 30분
  2. 문제 사이트 : 백준
  3. 문제 수준 : 골드 5
  4. 문제 유형 : 구현, 시뮬레이션
  5. 다른 사람의 풀이를 참고 했는가 ? : X
  6. 한 번 풀었다가 다시 푸는 문제인가 ? : X
  7. 문제 링크 : https://www.acmicpc.net/problem/14891
  8. 푼 날짜 : 2023.04.08

1. 사용한 자료구조 & 알고리즘

시뮬레이션, 구현. 큐.

2. 사고과정

문제에 적힌 그대로를 구현. 하나 주의할 것이 있다면 톱니바퀴를 굴리고 옆의 톱니바퀴를 체크하는 것이 아닌,
옆의 톱니바퀴들을 모두 체크하고 톱니바퀴를 굴려야한다.
톱니바퀴를 굴리고 나서 옆의 톱니바퀴를 체크하면 이미 굴린 후라 N과 S가 바뀌게 되고, 굴리지 말아야 할 것을 굴리거나 굴려야 하는 것을 못 굴리게 된다.

3. 풀이과정

  1. index로 본다면 왼쪽은 2, 오른쪽은 6이다.
    내 왼쪽 톱니바퀴의 2번쨰 인덱스와 내 6번쨰 인덱스
    내 오른쪽 톱니바퀴의 6번째 인덱스와 내 2번째 인덱스 를 queue로 하나씩 비교
  2. 돌려야한다면 시계방향이면 1, 반시계방향이면 -1로 기억해둠.
  3. 나중에 한 번에 돌린다.

4. 소스코드

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

public class Main{

	static int arr[][];

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

		StringTokenizer st;

		arr=new int[5][8];

		for(int i=1;i<arr.length;i++) {
			String line=br.readLine();
			for(int j=0;j<arr[0].length;j++) {
				arr[i][j]=line.charAt(j)-'0';
			}
		}
		int K=Integer.parseInt(br.readLine());


		for(int i=0;i<K;i++) {
			st=new StringTokenizer(br.readLine());
			int n1=Integer.parseInt(st.nextToken());
			int n2=Integer.parseInt(st.nextToken());

			gear(n1,n2);

		}
		int num[]= {0,1,2,4,8};
		int sum=0;

		for(int i=1;i<arr.length;i++) {
			if(arr[i][0]==1)
				sum+=num[i];

		}

		System.out.println(sum);


	}


	public static void gear(int n1,int n2) {
		//n2가 1이면 시계방향, -1이면 반시계방향

		int copy[][]=new int[5][8];

		for(int i=1;i<copy.length;i++)
			copy[i]=arr[i].clone();

		int left=6;
		int right=2;

		Queue<Gear> queue=new LinkedList<>();
		queue.add(new Gear(n1,true,n2));

		Gear moving[]=new Gear[arr.length];

		for(int i=1;i<moving.length;i++)
			moving[i]=new Gear(i,false,0);

		moving[n1].move=true;

		while(!queue.isEmpty()) {
			Gear temp= queue.poll();
			int number=temp.number;
			boolean move=temp.move;
			int dir=temp.dir;
			moving[number] = new Gear(number,move,dir);


			int changedDir = dir==1?-1:1;
			if(number-1>=1) {	
				if(arr[number][left]!=arr[number-1][right]&&!moving[number-1].move) 
					queue.add(new Gear(number-1,true,changedDir));

			}

			if(number+1<=4) {	
				if(arr[number][right]!=arr[number+1][left]&&!moving[number+1].move)
					queue.add(new Gear(number+1,true,changedDir));
			}


		}

		for(int i=1;i<moving.length;i++) {
			if(moving[i].move) {
				if(moving[i].dir== -1) { //반시계방향

					int idx=1;
					for(int j=0;j<arr[0].length;j++) {
						arr[i][j]= copy[i][idx++];
						if(idx==8) idx=0;
					}

				}
				else { //시계방향
					int idx = 7;
					for(int j=0;j<arr[0].length;j++) {
						arr[i][j] = copy[i][idx++];
						if(idx==8) idx=0;
					}
				}


			}

		}



	}

}

class Gear {
	int number;
	boolean move;
	int dir;
	Gear(int number,boolean move,int dir){
		this.number=number;
		this.move=move;
		this.dir=dir;
	}
}

5. 결과

6. 회고

문제 난이도에 비해 시간도 오래걸리고 코드도 이상하게 짠 것 같다.. 시간이 오래걸린 이유는 바보같이 0~3번째 톱니바퀴를 지정해 줬는데 여기서는 1~4번째 톱니바퀴였다. 그거를 못 찾아가지고 결괏값이 계속 이상하게 나왔다.
문제가 0번째 인덱스부터 시작인지 1번째 인덱스부터 시작인지 확인하고 배열을 만들자 !!!!

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람

0개의 댓글