백준의 톱니바퀴2 (15662) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 톱니바퀴1과 전체적인 문제는 똑같고 톱니바퀴의 수만 더 증가한 문제이다.
본인은 전체적인 로직 또한 톱니바퀴1과 굉장히 비슷하게 풀었다.
단지, 톱니바퀴1에서는 바퀴가 4개뿐이라서, 4개를 하나하나 다 체크해가면서 톱니바퀴를 돌려준 반면, 이 문제에서는
for문으로 돌려야 하는 톱니바퀴를 기준으로 왼쪽과 오른쪽으로 나눠서 돌려야 할 톱니바퀴들을
따로 저장 후 실제로 돌려주는 과정만 더 추가해 주었다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | #include<iostream> #include<vector> #include<string> #define endl "\n" #define MAX 1010 using namespace std; int T, K; vector<int> V[MAX]; vector<pair<int, int>> Cmd; void Input() { cin >> T; for (int i = 1; i <= T; i++) { string S; cin >> S; for (int j = 0; j < S.length(); j++) { V[i].push_back(S[j] - '0'); } } cin >> K; for (int i = 0; i < K; i++) { int a, b; cin >> a >> b; Cmd.push_back(make_pair(a, b)); } } int Reverse(int Dir) { if (Dir == 1) return -1; else return 1; } vector<pair<int,int>> Find_Turn_Wheel(int Idx, int Dir) { vector<pair<int, int>> R; R.push_back(make_pair(Idx, Dir)); int Side1 = V[Idx].at(2); int Side2; int Cur_Dir = Dir; for (int i = Idx + 1; i <= T; i++) { Side2 = V[i].at(6); if (Side1 != Side2) { R.push_back(make_pair(i, Reverse(Cur_Dir))); Side1 = V[i].at(2); Cur_Dir = Reverse(Cur_Dir); } else break; } Side1 = V[Idx].at(6); Side2 = -1; Cur_Dir = Dir; for (int i = Idx - 1; i >= 1; i--) { Side2 = V[i].at(2); if (Side1 != Side2) { R.push_back(make_pair(i, Reverse(Cur_Dir))); Side1 = V[i].at(6); Cur_Dir = Reverse(Cur_Dir); } else break; } return R; } void Turning(int Idx, int Dir) { if (Dir == 1) { int Temp = V[Idx].at(7); for (int i = 6; i >= 0; i--) { V[Idx].at(i + 1) = V[Idx].at(i); } V[Idx].at(0) = Temp; } else { int Temp = V[Idx].at(0); for (int i = 1; i <= 7; i++) { V[Idx].at(i - 1) = V[Idx].at(i); } V[Idx].at(7) = Temp; } } void Actual_Turning(vector<pair<int, int>> Wheel) { for (int i = 0; i < Wheel.size(); i++) { int Idx = Wheel[i].first; int Dir = Wheel[i].second; Turning(Idx, Dir); } } void Solution() { for (int i = 0; i < K; i++) { int W_Idx = Cmd[i].first; int Dir = Cmd[i].second; vector<pair<int, int>> Turn_Wheel; Turn_Wheel = Find_Turn_Wheel(W_Idx, Dir); Actual_Turning(Turn_Wheel); } int Cnt = 0; for (int i = 1; i <= T; i++) { if (V[i].at(0) == 1) Cnt++; } cout << Cnt << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 4574 ] 스도미노쿠 (C++) (0) | 2020.02.27 |
---|---|
[ 백준 16397 ] 탈출 (C++) (0) | 2020.02.27 |
[ 백준 1079 ] 마피아 (C++) (5) | 2020.02.26 |
[ 백준 17090 ] 미로 탈출하기 (C++) (0) | 2020.02.26 |
[ 백준 2665 ] 미로 만들기 (C++) (0) | 2020.02.25 |