문제
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
입력
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다.
다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다. 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.
출력
총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력한다. 점수란 다음과 같이 계산한다.
- 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
- 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
- 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
- 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점
풀이과정
1. 크기가 8인 배열 tobni1 ~ tobni4 에 주어진 데이터를 넣는다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
tobni1 = new int[8];
tobni2 = new int[8];
tobni3 = new int[8];
tobni4 = new int[8];
String get1 = br.readLine();
String get2 = br.readLine();
String get3 = br.readLine();
String get4 = br.readLine();
for(int i=0; i<get1.length(); i++) {
tobni1[i] = get1.charAt(i) - '0';
tobni2[i] = get2.charAt(i) - '0';
tobni3[i] = get3.charAt(i) - '0';
tobni4[i] = get4.charAt(i) - '0';
}
2. K의 횟수만큼 반복문을 도는데, where : 1,2,3,4 톱니바퀴의 위치 , direction : 1 (시계) -1 (반시계) 이다.
2_1. 시계방향으로 회전시켜 배열을 오른쪽으로 한칸 씩 이동 시키는 함수 RoundRight,
반시계방향으로 회전시켜 배열을 왼쪽으로 한칸 씩 이동 시키는 함수 RoundLeft 를 정의한다.
public static void RoundRight(int arr[]) {
int temp = arr[0];
int temp2 = 0;
for(int i=1; i<arr.length; i++) {
temp2 = arr[i];
arr[i] = temp;
temp = temp2;
if(i == arr.length - 1) {
arr[0] = temp;
}
}
}
public static void RoundLeft(int arr[]) {
int temp = arr[arr.length-1];
int temp2 = 0;
for(int i=arr.length-2; i>=0; i--) {
temp2 = arr[i];
arr[i] = temp;
temp = temp2;
if(i == 0) {
arr[arr.length-1] = temp;
}
}
}
2_2. 배열[2] : 톱니바퀴의 3시방향, 배열[6] : 톱니바퀴의 9시방향이
서로 같고 다른 경우를 모두 확인하여 조건문을 처리해준다. [ex] where : 1, direction : 1 톱니바퀴1 시계방향회전
이 과정을 where 1~4, 각 톱니바퀴별 direction 1, -1 모든 경우의 조건문을 작성한다.
if(tobni1[2] != tobni2[6]) {
RoundRight(tobni1);
if(tobni2[2] != tobni3[6]) {
RoundLeft(tobni2);
if(tobni3[2] != tobni4[6]) {
RoundRight(tobni3);
RoundLeft(tobni4);
}
else {
RoundRight(tobni3);
continue;
}
}
else {
RoundLeft(tobni2);
continue;
}
}
else {
RoundRight(tobni1);
continue;
}
3. tobni[0] : 톱니바퀴의 12시방향 에 위치한 N,S극을 확인하여 S극 일 경우 점수를 더해준다.
if(tobni1[0] == 1) {
result += 1;
}
if(tobni2[0] == 1) {
result += 2;
}
if(tobni3[0] == 1) {
result += 4;
}
if(tobni4[0] == 1) {
result += 8;
}
4. 더해진 점수들의 합 result를 출력한다.
Solution
import java.util.*;
import java.io.*;
public class BaekJoon_14891_톱니바퀴 {
public static int tobni1[], tobni2[], tobni3[], tobni4[];
public static int K, result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
tobni1 = new int[8];
tobni2 = new int[8];
tobni3 = new int[8];
tobni4 = new int[8];
String get1 = br.readLine();
String get2 = br.readLine();
String get3 = br.readLine();
String get4 = br.readLine();
for(int i=0; i<get1.length(); i++) {
tobni1[i] = get1.charAt(i) - '0';
tobni2[i] = get2.charAt(i) - '0';
tobni3[i] = get3.charAt(i) - '0';
tobni4[i] = get4.charAt(i) - '0';
}
K = Integer.parseInt(br.readLine());
for(int i=0; i<K; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int where = Integer.parseInt(st.nextToken());
int direction = Integer.parseInt(st.nextToken());
if(where == 1) {
if(direction == 1) {
if(tobni1[2] != tobni2[6]) {
RoundRight(tobni1);
if(tobni2[2] != tobni3[6]) {
RoundLeft(tobni2);
if(tobni3[2] != tobni4[6]) {
RoundRight(tobni3);
RoundLeft(tobni4);
}
else {
RoundRight(tobni3);
continue;
}
}
else {
RoundLeft(tobni2);
continue;
}
}
else {
RoundRight(tobni1);
continue;
}
}
else if(direction == -1) {
if(tobni1[2] != tobni2[6]) {
RoundLeft(tobni1);
if(tobni2[2] != tobni3[6]) {
RoundRight(tobni2);
if(tobni3[2] != tobni4[6]) {
RoundLeft(tobni3);
RoundRight(tobni4);
}
else {
RoundLeft(tobni3);
continue;
}
}
else {
RoundRight(tobni2);
continue;
}
}
else {
RoundLeft(tobni1);
continue;
}
}
}
else if(where == 2) {
if(direction == 1) {
if(tobni2[6] != tobni1[2]) {
RoundLeft(tobni1);
}
if(tobni2[2] != tobni3[6]) {
RoundRight(tobni2);
if(tobni3[2] != tobni4[6]) {
RoundLeft(tobni3);
RoundRight(tobni4);
}
else {
RoundLeft(tobni3);
continue;
}
}
else {
RoundRight(tobni2);
continue;
}
}
else if(direction == -1) {
if(tobni2[6] != tobni1[2]) {
RoundRight(tobni1);
}
if(tobni2[2] != tobni3[6]) {
RoundLeft(tobni2);
if(tobni3[2] != tobni4[6]) {
RoundRight(tobni3);
RoundLeft(tobni4);
}
else {
RoundRight(tobni3);
continue;
}
}
else {
RoundLeft(tobni2);
continue;
}
}
}
else if(where == 3) {
if(direction == 1) {
if(tobni3[2] != tobni4[6]) {
RoundLeft(tobni4);
}
if(tobni3[6] != tobni2[2]) {
RoundRight(tobni3);
if(tobni2[6] != tobni1[2]) {
RoundLeft(tobni2);
RoundRight(tobni1);
}
else {
RoundLeft(tobni2);
continue;
}
}
else {
RoundRight(tobni3);
continue;
}
}
else if(direction == -1) {
if(tobni3[2] != tobni4[6]) {
RoundRight(tobni4);
}
if(tobni3[6] != tobni2[2]) {
RoundLeft(tobni3);
if(tobni2[6] != tobni1[2]) {
RoundRight(tobni2);
RoundLeft(tobni1);
}
else {
RoundRight(tobni2);
continue;
}
}
else {
RoundLeft(tobni3);
continue;
}
}
}
else if(where == 4) {
if(direction == 1) {
if(tobni4[6] != tobni3[2]) {
RoundRight(tobni4);
if(tobni3[6] != tobni2[2]) {
RoundLeft(tobni3);
if(tobni2[6] != tobni1[2]) {
RoundRight(tobni2);
RoundLeft(tobni1);
}
else {
RoundRight(tobni2);
continue;
}
}
else {
RoundLeft(tobni3);
continue;
}
}
else {
RoundRight(tobni4);
continue;
}
}
else if(direction == -1) {
if(tobni4[6] != tobni3[2]) {
RoundLeft(tobni4);
if(tobni3[6] != tobni2[2]) {
RoundRight(tobni3);
if(tobni2[6] != tobni1[2]) {
RoundLeft(tobni2);
RoundRight(tobni1);
}
else {
RoundLeft(tobni2);
continue;
}
}
else {
RoundRight(tobni3);
continue;
}
}
else {
RoundLeft(tobni4);
continue;
}
}
}
}
if(tobni1[0] == 1) {
result += 1;
}
if(tobni2[0] == 1) {
result += 2;
}
if(tobni3[0] == 1) {
result += 4;
}
if(tobni4[0] == 1) {
result += 8;
}
System.out.println(result);
}
public static void RoundRight(int arr[]) {
int temp = arr[0];
int temp2 = 0;
for(int i=1; i<arr.length; i++) {
temp2 = arr[i];
arr[i] = temp;
temp = temp2;
if(i == arr.length - 1) {
arr[0] = temp;
}
}
}
public static void RoundLeft(int arr[]) {
int temp = arr[arr.length-1];
int temp2 = 0;
for(int i=arr.length-2; i>=0; i--) {
temp2 = arr[i];
arr[i] = temp;
temp = temp2;
if(i == 0) {
arr[arr.length-1] = temp;
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 7662번 이중 우선순위 큐 (0) | 2020.11.05 |
---|---|
[JAVA] 백준 10816번 숫자 카드 2 (2) | 2020.10.27 |
[JAVA] 백준 14502번 연구소 (2) | 2020.10.21 |
[JAVA] 백준 18870번 좌표 압축 (0) | 2020.10.21 |
[JAVA] 백준 3190번 뱀 (0) | 2020.10.20 |