문제 링크
주의사항
- 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번 톱니바퀴 시계방향 회전!
3 1 : 3번 톱니바퀴 시계방향 회전
4 1 : 4번 톱니바퀴 시계방향 회전
1번 톱니바퀴 반시계방향 회전
3. 모든 회전이 끝난 뒤 톱니바퀴의 점수를 결과로 출력합니다.
톱니바퀴 2 : 2¹ = 2
톱니바퀴 3 : 2² = 4
톱니바퀴의 점수 : 2 + 4 = 6
6을 결과로 출력합니다.
- BufferedReader를 사용하여 입력되는 정보를 저장합니다.
- StringTokenizer를 이용하여 톱니바퀴의 정보를 띄어쓰기 기준 나누었습니다.
- setGear를 이용하여 문자열을 배열의 형태로 저장하였습니다.
- K번 startGear를 이용하여 시뮬레이션을 진행합니다.
- 모든 시뮬레이션 종료한 뒤, 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;
}
}
}
'백준' 카테고리의 다른 글
[백준] 알고리즘 분류(구현,JAVA)2573번, 빙산 (2) | 2022.12.28 |
---|---|
[백준] 알고리즘 분류(구현,JAVA)3190번, 뱀 (0) | 2022.12.26 |
[백준] 알고리즘 분류(수학,JAVA)1094번, 막대기 (0) | 2022.12.24 |
[백준] 알고리즘 분류(자료구조,JAVA)1406번, 에디터 (0) | 2022.12.23 |
[백준] 알고리즘 분류(너비 우선 탐색,JAVA)1389번, 케빈 베이컨의 6단계 법칙 (0) | 2022.12.22 |
댓글