본문 바로가기
백준

[백준] 알고리즘 분류(구현,JAVA)14891번, 톱니바퀴

by 열정적인 이찬형 2022. 12. 26.

문제 링크

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

 

1. 톱니바퀴는 4개가 존재하며,  톱니의 방향에는 S와 N극이 존재합니다.

2. 입력값이 1이면 시계, -1이면 반시계로 회전합니다.

3. 마주보는 톱니바퀴의 극이 다르면 반대로 회전을 진행합니다.

4. K번 회전시킨 후 톱니바퀴의 점수를 결과로 출력합니다.

 

알고리즘 진행 순서.

 

1. 입력된 정보를 저장합니다.

 

2. K번 톱니바퀴를 회전하는 과정을 진행합니다.

 

3. 모든 회전이 끝난 뒤 톱니바퀴의 점수를 결과로 출력합니다.

 

 

톱니바퀴 회전 과정.

 

회전 과정은 문제에서 자세히 그림으로 설명하고 있기 때문에 자세하게 다루지는 않겠습니다.
 

톱니바퀴 점수 얻기.

 

톱니바퀴 점수에는 규칙이 존재합니다.

톱니바퀴1 : 1

톱니바퀴2 : 2¹

톱니바퀴3 : 2²

...

 

n : 톱니바퀴 번호 - 1

톱니바퀴의 12시가 S극일 때 얻는 점수 : 2ⁿ

 

예제입력 3.

 

1. 입력된 정보를 저장합니다.

 

톱니바퀴 1 : 10001011
톱니바퀴 2 : 10000011
톱니바퀴 3 : 01011011
톱니바퀴 4 : 00111101

 


K : 5


1 1 : 1번 톱니바퀴 시계방향 회전
2 1 : 2번 톱니바퀴 시계방향 회전
3 1 : 3번 톱니바퀴 시계방향 회전
4 1 : 4번 톱니바퀴 시계방향 회전
1 -1 : 1번 톱니바퀴 반시계방향 회전

 

2. K번 톱니바퀴를 회전하는 과정을 진행합니다.

 

1번 톱니바퀴 시계방향 회전!

 

 

2번 톱니바퀴 시계방향 회전
 

3 1 : 3번 톱니바퀴 시계방향 회전

4 1 : 4번 톱니바퀴 시계방향 회전

 

1번 톱니바퀴 반시계방향 회전

 

3. 모든 회전이 끝난 뒤 톱니바퀴의 점수를 결과로 출력합니다.

 

 

톱니바퀴 2 : 2¹ = 2

톱니바퀴 3 : 2² = 4

 

톱니바퀴의 점수 : 2 + 4 = 6

 

6을 결과로 출력합니다.

 

  • BufferedReader를 사용하여 입력되는 정보를 저장합니다.
  • StringTokenizer를 이용하여 톱니바퀴의 정보를 띄어쓰기 기준 나누었습니다.
  • setGear를 이용하여 문자열을 배열의 형태로 저장하였습니다.
  • KstartGear를 이용하여 시뮬레이션을 진행합니다.
  • 모든 시뮬레이션 종료한 뒤, gearCheck를 이용하여 톱니바퀴 수를 구합니다.
  • 톱니바퀴 수를 결과로  BufferedWriter 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.
  • setGear함수는 톱니바퀴 정보가 담긴 문자열을 배열에 형태로 저장합니다.
  • startGear함수는 기준 톱니바퀴를 회전할 때 양방향을 탐색하고 rotate함수를 실행하여 회전합니다.
  • rotate함수는 시계, 반시계 방향으로 톱니바퀴 회전을 진행합니다.
  • gearCheck함수는 톱니바퀴 수를 구합니다.

 

결과코드

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

public class Main{
    //톱니바퀴 상태 저장 배열
    static boolean[][] gear = new boolean[4][8];
    public static void main(String[] args) throws IOException {
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        //톱니바퀴 초기 상태 저장
        for(int i=0;i<4;i++){
            String state = br.readLine();
            setGear(i, state);	//초기 상태 저장!
        }
        int K = Integer.parseInt(br.readLine());
        //톱니바퀴 회전 진행!
        for(int i=0;i<K;i++){
            st = new StringTokenizer(br.readLine()," ");
            int n = Integer.parseInt(st.nextToken()) - 1;	//톱니바퀴 번호
            int direction = Integer.parseInt(st.nextToken());	//회전 방향
            startGear(n, direction);	//시뮬레이션 진행!
        }
        int answer = gearCheck();	//톱니바퀴 점수 구하기!
        bw.write(answer + "");	//톱니바퀴 점수 BufferedWriter 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
    //톱니바퀴 점수 구하는 함수
    static int gearCheck(){
        int answer = 0;
        //각 톱니바퀴의 12시 방향 극 확인
        for(int i=0;i<4;i++){
            if(gear[i][0])	//S극일 때
                answer += Math.pow(2, i); //점화식을 이용하여 더하기!
        }
        return answer;	//톱니바퀴 점수 반환
    }
    //톱니바퀴 회전 시뮬레이션 진행!
    static void startGear(int index, int direction){
        boolean magnet = gear[index][2];	//기준 톱니바퀴 3시 방향의 극
        int nDirection = direction;
        //기준 톱니바퀴 오른쪽에 있는 톱니바퀴들 탐색
        for(int i=index+1;i<4;i++){
            if(gear[i][6] != magnet){	//마주보는 극이 다를 때
                magnet = gear[i][2];	//다음 톱니바퀴를 탐색하기 위해 변경
                nDirection *= -1;	//방향 변경
                rotate(i, nDirection);	//회전 진행
            }else
                break;
        }
        magnet = gear[index][6];	//기준 톱니바퀴 9시 방향의 극
        nDirection = direction;
        //기준 톱니바퀴 왼쪽에 있는 톱니바퀴들 탐색
        for(int i=index-1;i>=0;i--){
            if(gear[i][2] != magnet){	//마주보는 극이 다를 때
                magnet = gear[i][6];	//다음 톱니바퀴를 탐색하기 위해 변경
                nDirection *= -1;	//방향 변경
                rotate(i, nDirection);	//회전 진행
            }else
                break;
        }
        rotate(index, direction);	//기준 톱니바퀴 회전 진행!
    }
    //톱니바퀴 회전 진행하는 함수
    static void rotate(int index, int rotate){
        boolean temp;
        //시계방향 회전
        if(rotate == 1){
            temp = gear[index][7];
            for(int i=7;i>0;i--)
                gear[index][i] = gear[index][i-1];
            gear[index][0] = temp;
        }else{		//반시계방향 회전
            temp = gear[index][0];
            for(int i=0;i<7;i++)
                gear[index][i] = gear[index][i+1];
            gear[index][7] = temp;
        }
    }
    //초기 톱니바퀴 값들 저장하는 함수
    static void setGear(int index, String state){
        for(int i=0;i<8;i++){
            if(state.charAt(i) == '1')	//S극 : True
                gear[index][i] = true;
            else		//N극 : False
                gear[index][i] = false;
        }
    }
}

댓글