14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
메소드별 역할을 설계해서 재귀로 풀었다.
roll() : 톱니 회전
right() : 오른쪽 톱니 체크후 쉬프트
letf() : 왼쪽 톱니 체크후 쉬프트
swap() : 쉬프트
check() : 최종 톱니상태 점수 출력
print() : 톱니 출력
* 주의 * 왼쪽, 오른쪽 톱니의 상태를 비교 후 자신의 톱니상태를 변경해주어야 함.
-그렇지않으면 자신의 톱니상태가 변경된 후 왼쪽,오른쪽을 비교하게 되므로 틀림
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class 톱니바퀴 {
static int arr[][];
static int K;//회전횟수
static int ans;//최종점수
public static void main(String[] args) throws FileNotFoundException {
System.setIn(new FileInputStream("input/톱니바퀴.txt"));
Scanner sc = new Scanner(System.in);
arr = new int[4][8];//톱니가 8개인 4개의 톱니바퀴
for (int i = 0; i < 4; i++) {
String str = sc.next();
for (int j = 0; j < 8; j++) {
arr[i][j] = str.charAt(j)-'0';
}
}
K = sc.nextInt();//회전횟수
for (int i = 0; i < K; i++) {
int N = sc.nextInt()-1;//회전시킨 톱니바퀴의 번호 0~3
int dir =sc.nextInt();//회전시킨 방향 -1(반시계 왼쪽쉬프트) or 1(시계 오른쪽쉬프트)
roll(N,dir);//회전
}
check();//점수계산
System.out.println(ans);
// print();
}
private static void roll(int n, int dir) {
//왼쪽돌리기
left(n-1, -dir);
//오른쪽돌리기
right(n+1,-dir);
//자기자신돌리기
swap(n,dir);
}
private static void right(int n, int dir) {
if(n>3) return;//톱니인덱스가 3보다 커지면 리턴
if(arr[n][6]!=arr[n-1][2]) {//오른쪽의 6번쨰와 내꺼의2번째가 다르다면 오른쪽으로 더감
right(n+1, -dir);//오른쪽으로 가주고
swap(n,dir);//swap해줌
}
}
private static void left(int n, int dir) {
if(n<0) return;//톱니인덱스가 0보다 작으면 리턴
if(arr[n][2]!=arr[n+1][6]) {//왼쪽의 2번째와 내꺼의 6이 다르다면 왼쪽으로 더감
left(n-1,-dir);
swap(n,dir);//왼쪽으로 가고나서 swap해줌
}
}
private static void print() {//톱니상태체크함수
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(arr[i][j]+" ");
}System.out.println();
}
}
private static void check() {//점수체크함수
for (int i = 0; i < 4; i++) {
ans += arr[i][0] * (1<<i);
}
}
private static void swap(int n,int dir) {//그냥 쉬프트연산만 수행 n: 현재 인덱스 dir:전거의방향
if(dir==1) {//시계방향으로 회전시킨 경우 ->오른쪽쉬프트
int temp = arr[n][7];
for (int i = 7; i >=1; i--) {
arr[n][i]=arr[n][i-1];
}
arr[n][0]=temp;
}
if(dir==-1){//반시계방향으로 회전시킨경우 <-왼쪽쉬프트
int temp = arr[n][0];
for (int i = 0; i <=6; i++) {
arr[n][i]=arr[n][i+1];
}
arr[n][7]=temp;
}
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
백준- 15686 치킨 배달 (0) | 2021.02.18 |
---|---|
백준 -2567 색종이2 (0) | 2021.02.17 |
백준 3040 백설 공주와 일곱 난쟁이 (0) | 2021.02.16 |
백준 2961 도영이가 만든 맛있는 음식 (0) | 2021.02.15 |
백준- 2178 미로탐색 (0) | 2021.02.14 |
댓글