-
[백준 14891번 - 톱니바퀴] C++ 풀이알고리즘/삼성SW역량테스트기출 2021. 9. 23. 15:47728x90반응형
https://www.acmicpc.net/problem/14891
톱니바퀴 4개간 서로 마주보고있는 극이 다르면 회전, 다르지 않으면 그대로 둔다.
회전 방향은 마주한 톱니바퀴와는 반대방향이 된다.
처음 상태에서 톱니바퀴간 마주보고있는 극이 서로 다른지를 먼저 검사한다.
그리고 처음 돌리는 톱니바퀴의 번호에 따라 이웃하는 톱니바퀴들의 방향과/ 회전할지말지를 문제 조건에 따라 구현해주면 된다.
결국 구현하면 되는 문제!
완성한 코드
#include <stdio.h> #include <vector> #include <string> using namespace std; vector<vector<int>> v; int ans = 0; void rotate(vector<int> &v, int r) { if (r == 1) { // 시계방향 int temp = v[7]; for(int i = 6; i >= 0; --i) { v[i + 1] = v[i]; } v[0] = temp; } else { int temp = v[0]; for(int i = 0; i <= 6; ++i) { v[i] = v[i + 1]; } v[7] = temp; } } int main() { v.assign(5, vector<int>(9, 0)); for(int i = 0; i < 4; ++i) { char s[8]; scanf("%s", s); for(int j = 0; j < 8; ++j) { if (s[j] == '0') v[i][j] = 0; else v[i][j] = 1; } } int c; vector<pair<int, int>> r; scanf("%d", &c); for(int i = 0; i < c; ++i) { int t1, t2; scanf("%d %d", &t1, &t2); r.push_back(make_pair(t1, t2)); } for(int i = 0; i < c; ++i) { bool a = false; bool b = false; bool c = false; if (v[0][2] != v[1][6]) { // 1번의 2 와 2번의 6 a = true; } if (v[1][2] != v[2][6]) { // 2번의 2 와 3번의 6 b = true; } if (v[2][2] != v[3][6]) { // 3번의 2 와 4번의 6 c = true; } if (r[i].first == 1) { // 1번 r[i].second 방향으로 움직인다. rotate(v[0], r[i].second); if (a) { // 2번 -r[c].second 방향으로 움직인다 rotate(v[1], -r[i].second); } if (a && b) { // 3번 r[c].second 방향으로 움직인다 rotate(v[2], r[i].second); } if (a && b && c) { // 4번 -r[c].second 방향으로 움직인다 rotate(v[3], -r[i].second); } } else if (r[i].first == 2) { rotate(v[1], r[i].second); if (a) { rotate(v[0], -r[i].second); } if (b) { rotate(v[2], -r[i].second); } if (b && c) { rotate(v[3], r[i].second); } } else if (r[i].first == 3) { rotate(v[2], r[i].second); if (c) { rotate(v[3], -r[i].second); } if (b) { rotate(v[1], -r[i].second); } if (b && a) { rotate(v[0], r[i].second); } } else { rotate(v[3], r[i].second); if (c) { rotate(v[2], -r[i].second); } if (b && c) { rotate(v[1], r[i].second); } if (b && c && a) { rotate(v[0], -r[i].second); } } } if (v[0][0]) ans += 1; if (v[1][0]) ans += 2; if (v[2][0]) ans += 4; if (v[3][0]) ans += 8; printf("%d\n", ans); return 0; }
728x90'알고리즘 > 삼성SW역량테스트기출' 카테고리의 다른 글
[백준 16234번 - 인구 이동] C++ 풀이 (0) 2021.10.02 [백준 15684번 - 사다리 타기] C++ 풀이 (0) 2021.09.23 [백준 14889번 - 스타트와 링크] C++ 풀이 (0) 2021.09.19 [백준 14503번 - 로봇 청소기] C++ 풀이 (0) 2021.09.19 [백준 14500번 - 테르로미노] C++ 풀이 (0) 2021.09.19