-
[백준/BOJ] 14891번 톱니바퀴 (C++)알고리즘 문제풀이/백준 2020. 12. 5. 17:40
삼성 역량 테스트 기출 문제 : 시뮬레이션(구현)
특정 톱니바퀴를 움직였을 때 이에 인접해있는 톱니들이 움직이는지 안움직이는지, 움직인다면 어떤 방향으로 움직이는지를 처리하기가 어려웠던 문제였습니다. 이러한 체크를 먼저 하기 위해서 rotCheck 배열을 두어 특정 톱니바퀴를 움직일 때, 그 톱니바퀴의 왼쪽과 오른쪽을 각각 쭉 확인하여 왼쪽 톱니바퀴의 2번 인덱스와 오른쪽 톱니바퀴의 6번 인덱스가 같은지 확인하고, 다르다면 회전할 수 있으므로 회전 방향을 기록했습니다.
톱니바퀴의 시계 방향, 반시계 방향 회전 처리는 다음과 같이 처리 했습니다.
시계방향처리
10101111 -> 11010111 뒤에 원소를 앞에다 넣어준다.
반시계방향처리
10101111 -> 01011111 앞에 원소를 뒤에다 넣어준다.#include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; vector<string> gear(5); int rotCheck[5]; int k, answer; // 점수를 계산하는 함수 void getScore() { for(int i = 1; i <= 4; i++) { if(gear[i][0] == '1') { answer += (1 << i - 1); } } } // 톱니바퀴를 회전하는 함수 void rotate() { for(int i = 1; i <= 4; i++) { // 시계 방향으로 회전 if(rotCheck[i] == 1) { string tmp = ""; tmp = gear[i].back(); gear[i].insert(0, tmp); gear[i].pop_back(); } // 반시계 방향으로 회전 if(rotCheck[i] == -1) { char tmp = gear[i].front(); gear[i].push_back(tmp); gear[i].erase(gear[i].begin()); } } } // 톱니바퀴가 어느 방향으로 움직이는지 확인하는 함수 void check(int target, int cmd) { rotCheck[target] = cmd; // 타겟으로부터 왼쪽 확인 for(int left = target - 1; left >= 1; left--) { int right = left + 1; // 왼쪽 톱니바퀴의 2번 인덱스 == 오른쪽 톱니바퀴의 6번 인덱스면 움직이지 않음 if(gear[left][2] == gear[right][6]) { break; } // 왼쪽 톱니바퀴의 2번 인덱스 != 오른쪽 톱니바퀴의 6번 인덱스면 반대 방향으로 움직임 if(gear[left][2] != gear[right][6]) { rotCheck[left] = rotCheck[right] * -1; } } // 타겟으로부터 오른쪽 확인 for(int right = target + 1; right <= 4; right++) { int left = right - 1; // 왼쪽 톱니바퀴의 2번 인덱스 == 오른쪽 톱니바퀴의 6번 인덱스면 움직이지 않음 if(gear[left][2] == gear[right][6]) { break; } // 왼쪽 톱니바퀴의 2번 인덱스 != 오른쪽 톱니바퀴의 6번 인덱스면 반대 방향으로 움직임 if(gear[left][2] != gear[right][6]) { rotCheck[right] = rotCheck[left] * -1; } } } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); for(int i = 1; i <= 4; i++) { cin>>gear[i]; } cin>>k; while(k--) { int target, cmd; cin>>target>>cmd; check(target, cmd); rotate(); memset(rotCheck, 0, sizeof(rotCheck)); } getScore(); cout<<answer; }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 6064번 카잉 달력 (C++) (0) 2020.12.07 [백준/BOJ] 10819번 차이를 최대로 (C++) (0) 2020.12.05 [백준/BOJ] 11559번 Puyo Puyo (C++) (0) 2020.12.05 [백준/BOJ] 13335번 트럭 (C++) (0) 2020.12.05 [백준/BOJ] 1748번 수 이어 쓰기 1 (C++) (0) 2020.12.04