문제
문제 바로가기> BOJ 14891번: 톱니바퀴
풀이
문제에서 요구하는 대로 구현해주면 되는 간단한 문제였다!
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 |