danbibibi
article thumbnail

문제

문제 바로가기> BOJ 14891번: 톱니바퀴

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

풀이

문제에서 요구하는 대로 구현해주면 되는 간단한 문제였다!

 

1. 톱니바퀴가 맞닿은 극이 같은지, 다른지 판단하여 방향을 저장한다.

2. 저장해둔 방향대로 회전을 진행한다.

3. 점수를 계산한다.

 

다만,, 톱니바퀴 회전 전 방향을 저장하지 않고, 회전 후 바뀐 방향으로 비교하는 바람에 조금 헤맸다 ^^,,

 

C++

#include<iostream>
#include<cstring>
#define MAX 4
#define SIZE 8
using namespace std;

int dirs[MAX]; // 회전 방향 저장
string gear[MAX]; // N극은 0, S극은 1

void rotate(int num, int dir){
    if(dir == -1){ // 반시계 방향 회전
        gear[num] = gear[num] + gear[num][0];
        gear[num] = gear[num].substr(1, SIZE);
    }
    else{ // 시계 방향 회전
        gear[num] = gear[num][SIZE-1] + gear[num];
        gear[num] = gear[num].substr(0, SIZE);
    }
}

void solution(){
    for(int i=0; i<MAX; i++) cin >> gear[i];
    int K; cin >> K;

    int num, dir;
    while(K--){

        // 1. 방향 저장
        cin >> num >> dir;
        num--; // start with 0 index
        memset(dirs, 0, sizeof(dirs)); // init

        dirs[num] = dir;
        for(int i=num-1; i>=0; i--) { // 좌측 방향
            if(gear[i][2] == gear[i+1][6]) break; // 서로 맞닿은 톱니의 극이 같은 경우
            if(dirs[i+1] == -1) dirs[i] = 1;
            else dirs[i] = -1;
        }
        for(int i=num+1; i<MAX; i++) { // 우측 방향
            if(gear[i-1][2] == gear[i][6]) break;
            if(dirs[i-1] == -1) dirs[i] = 1;
            else dirs[i] = -1;
        }

        // 2. 회전
        for(int i=0; i<MAX; i++){
            if(dirs[i] == 0) continue;
            rotate(i, dirs[i]);
        }
    }
}

void output(){
    int ans = 0;
    int power2[] = {1, 2, 4, 8}; 
    for(int i=0; i<MAX; i++){
        if(gear[i][0] == '1') ans+=power2[i]; // S극
    } cout << ans;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    solution();
    output();
}

 

Java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.StringTokenizer;

public class Main {
	
	static final int MAX = 4;
	static final int SIZE = 8;
	
	static int[] dirs; // 회전 방향 저장
	static String[] gear = new String[MAX]; // N극은 0, S극은 1

	public static void main(String[] args) throws Exception {
		solution();
		output();
	}

	private static void solution() throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for(int i=0; i<MAX; i++) gear[i] = br.readLine();
		StringTokenizer st = new StringTokenizer(br.readLine());
		int K = Integer.parseInt(st.nextToken());

	    int num, dir;
	    while(K-- > 0){

	        // 1. 방향 저장
	    	st = new StringTokenizer(br.readLine());
	    	num = Integer.parseInt(st.nextToken());
	        dir = Integer.parseInt(st.nextToken());
	        num--; // start with 0 index
	        dirs = new int[MAX]; // init

	        dirs[num] = dir;
	        for(int i=num-1; i>=0; i--) { // 좌측 방향
	            if(gear[i].charAt(2) == gear[i+1].charAt(6)) break; // 서로 맞닿은 톱니의 극이 같은 경우
	            if(dirs[i+1] == -1) dirs[i] = 1;
	            else dirs[i] = -1;
	        }
	        for(int i=num+1; i<MAX; i++) { // 우측 방향
	            if(gear[i-1].charAt(2) == gear[i].charAt(6)) break;
	            if(dirs[i-1] == -1) dirs[i] = 1;
	            else dirs[i] = -1;
	        }

	        // 2. 회전
	        for(int i=0; i<MAX; i++){
	            if(dirs[i] == 0) continue;
	            rotate(i, dirs[i]);
	        }
	    }
	}

	private static void rotate(int num, int dir) {
	    if(dir == -1){ // 반시계 방향 회전
	        gear[num] = gear[num] + gear[num].charAt(0);
	        gear[num] = gear[num].substring(1, SIZE+1);
	    }
	    else{ // 시계 방향 회전
	        gear[num] = gear[num].charAt(SIZE-1) + gear[num];
	        gear[num] = gear[num].substring(0, SIZE);
	    }
	}
	
	private static void output() {
	    int ans = 0;
	    int[] power2= {1, 2, 4, 8}; 
	    for(int i=0; i<MAX; i++){
	        if(gear[i].charAt(0) == '1') ans+=power2[i]; // S극
	    } System.out.println(ans);
	}


}

'문제 풀이 > SW 역량 테스트' 카테고리의 다른 글

BOJ 15683번: 감시  (0) 2023.01.26
BOJ 14501번: 퇴사  (0) 2023.01.24
BOJ 14890번: 경사로  (0) 2023.01.22
BOJ 21608번: 상어 초등학교  (0) 2023.01.17
BOJ 23290번: 마법사 상어와 복제  (0) 2023.01.16
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로