문제 : https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

 

문제 요약 : 톱니바퀴를 회전 시킨 후 점수 계산

입력 출력

N[4][8](톱니) = 0(N), 1(S)

1 ≤ K(회전수) ≤ 100

K줄 : (톱니번호(1~4)) (회전=1(R),-1(L))

점수 출력

1번톱니 S극이면 1점 추가

2번톱니 S극이면 2점 추가

3번톱니 S극이면 4점 추가

4번톱니 S극이면 8점 추가

 

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16373307 cbkpar 14891 맞았습니다!! 12972KB 76ms Java 1850B
import java.io.*;

public class Main {
	static int[][] gear = new int[4][8];

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,j,grn,grr;
		String str = "";
		
		for(i=0;i<4;i++) {
			str = br.readLine();
			for(j=0;j<8;j++) {
				gear[i][j] = str.charAt(j) - '0'; //문자형으로 받았기 때문에 숫자로 변환
			}
		}
		n = Integer.parseInt(br.readLine());
		for(i=0;i<n;i++) {
			str = br.readLine();
			String[] arr = str.split(" ");
			grn = Integer.parseInt(arr[0])-1;
			grr = Integer.parseInt(arr[1]);
			lrotate(grn,grr,1); // 왼쪽으로 확인하면서 회전
			rrotate(grn,grr,1); // 오른쪽으로 확인하면서 회전
			if(grr==1) { //회전방향이 시계방향이라면
            //배열을 오른쪽으로 미는 과정
				int tmp = gear[grn][7]; 
				for(j=7;j>0;j--) {
					gear[grn][j]=gear[grn][j-1];
				}
				gear[grn][0]=tmp;
			}else { //회전방향이 반시계방향이라면
            //배열을 왼쪽으로 미는 과정
				int tmp = gear[grn][0];
				for(j=0;j<7;j++) {
					gear[grn][j]=gear[grn][j+1];
				}
				gear[grn][7]=tmp;
			}
		}
        //점수계산
		int score = 0;
		if(gear[0][0]==1) score+=1;
		if(gear[1][0]==1) score+=2;
		if(gear[2][0]==1) score+=4;
		if(gear[3][0]==1) score+=8;
		System.out.println(score);
	}
	static void lrotate(int gn, int gr, int st) {
		if(gn<0) return; // 확인할 톱니가 없다면 리턴
		if(gn>=1&&gear[gn-1][2]!=gear[gn][6]) { //왼쪽톱니와 극이 다르다면
			lrotate(gn-1,gr*-1,0); // 왼쪽으로 한번더가면서 확인
		}
		if(st==1) return; // 첫번째 톱니라면 종료->메인함수에서 회전
        //회전
		if(gr==1) {
			int tmp = gear[gn][7];
			for(int i=7;i>0;i--) {
				gear[gn][i]=gear[gn][i-1];
			}
			gear[gn][0]=tmp;
		}else {
			int tmp = gear[gn][0];
			for(int i=0;i<7;i++) {
				gear[gn][i]=gear[gn][i+1];
			}
			gear[gn][7]=tmp;
		}
	}
    //오른쪽방향으로 확인
	static void rrotate(int gn, int gr, int st) {
		if(gn>3) return;
		if(gn<=2&&gear[gn+1][6]!=gear[gn][2]) {
			rrotate(gn+1,gr*-1,0);
		}
		if(st==1) return;
		if(gr==1) {
			int tmp = gear[gn][7];
			for(int i=7;i>0;i--) {
				gear[gn][i]=gear[gn][i-1];
			}
			gear[gn][0]=tmp;
		}else {
			int tmp = gear[gn][0];
			for(int i=0;i<7;i++) {
				gear[gn][i]=gear[gn][i+1];
			}
			gear[gn][7]=tmp;
		}
	}
}

 

JAVA - 회전부분을 함수화[속도 느려짐]

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16373910 cbkpar 14891 맞았습니다!! 12948KB 88ms Java 1239B
import java.io.*;

public class Main {
	static int[][] gear = new int[4][8];

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,j,grn,grr;
		String str = "";
		
		for(i=0;i<4;i++) {
			str = br.readLine();
			for(j=0;j<8;j++) {
				gear[i][j] = str.charAt(j) - '0';
			}
		}
		n = Integer.parseInt(br.readLine());
		for(i=0;i<n;i++) {
			str = br.readLine();
			String[] arr = str.split(" ");
			grn = Integer.parseInt(arr[0])-1;
			grr = Integer.parseInt(arr[1]);
			lcheck(grn,grr,1);
			rcheck(grn,grr,1);
			rotate(grn,grr);
		}
		int score = 0;
		for(i=3;i>=0;i--) {
			score*=2;
			if(gear[i][0]==1) score++;
		}
		System.out.println(score);
	}
	static void lcheck(int gn, int gr, int st) {
		if(gn<0) return;
		if(gn>=1&&gear[gn-1][2]!=gear[gn][6]) lcheck(gn-1,gr*-1,0);
		if(st!=1) rotate(gn,gr);
	}
	static void rcheck(int gn, int gr, int st) {
		if(gn>3) return;
		if(gn<=2&&gear[gn+1][6]!=gear[gn][2]) rcheck(gn+1,gr*-1,0);
		if(st!=1) rotate(gn,gr);
	}
	static void rotate(int gn, int gr) {
		int tn = (8-gr)%9;
		int tmp = gear[gn][tn];
		for(int i=0;i<7;i++) gear[gn][tn-gr*i]=gear[gn][tn-gr*(i+1)];
		gear[gn][7-tn]=tmp;
	}		
}

+ Recent posts