본문 바로가기
백준 문제 풀이 & C++ 공부

백준 15662 C++

by daisy0461 2024. 11. 20.

https://www.acmicpc.net/problem/15662

이전 톱니바퀴 1은 이진법으로 풀었었는데 이번엔 간단하게 vector를 rotate하는 방법으로 풀었다.

#include <bits/stdc++.h>

using namespace std;

//동일하게 극이 다르면 회전방향의 반대방향으로 회전한다.
//rotate <- / rrotate ->

int t, k;		//톱니바퀴는 1번부터 순서가 매겨진다. k번 회전한다.
int result = 0;
vector<vector<int>> toms(1005);
int visited[1005];

void turn(int tomNum, int dir)
{
	//cout << tomNum << "is turning\n";
	visited[tomNum] = 1;

	if (tomNum + 1 < t && !visited[tomNum + 1]) {		//tomNum + 1이 범위를 벗어나지 않으면서 방문하지 않은 톱니라면
		//현재 톱니와 오른쪽의 톱니와 비교해야한다.
		if (toms[tomNum][2] != toms[tomNum + 1][6]) {		//현재 톱니의 오른쪽과 오른쪽 톱니의 왼쪾이 동일하지 않으면 돌린다.
			turn(tomNum + 1, dir * -1);
		}
	}

	if (tomNum - 1 >= 0 && !visited[tomNum - 1]) {		//tomNum - 1이 범위를 벗어나지 않으면서 방문하지 않는 톱니라면
		if (toms[tomNum][6] != toms[tomNum - 1][2]) {		//현재 톱니의 오른쪽과 오른쪽 톱니의 왼쪾이 동일하지 않으면 돌린다.
			turn(tomNum - 1, dir * -1);
		}
	}

	//현재 톱니 돌리기
	if (dir == 1) {		//시계 방향 rrot
		rotate(toms[tomNum].rbegin(), toms[tomNum].rbegin() + 1, toms[tomNum].rend());
	}
	else {
		rotate(toms[tomNum].begin(), toms[tomNum].begin() + 1, toms[tomNum].end());
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> t;

	char tempTom;
	//12시가 [i][7]에 들어간다. 시계방향으로 1씩 줄어드는 입력이다.
	for (int i = 0; i < t; i++) {
		for (int j = 0; j < 8; j++) {
			cin >> tempTom;
			toms[i].push_back(tempTom - '0');
		}
	}

	cin >> k;

	int tom, dir;
	for (int i = 0; i < k; i++) {
		fill(&visited[0], &visited[0] + 1005, 0);

		cin >> tom >> dir;		//어느 톱니를 돌리는 것인지 
		turn(tom - 1, dir);

		/*cout << k << "turn result\n";
		for (int i = 0; i < t; i++) {
			for (int j : toms[i]) {
				cout << j;
			}
			cout << "\n";
		}*/
	}

	for (int i = 0; i < t; i++) {
		result += toms[i][0];
	}

	cout << result;

}

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 14888 C++  (0) 2024.11.29
백준 1911 C++  (0) 2024.11.22
백준 14891 C++  (1) 2024.11.19
백준 2529 C++  (0) 2024.10.19
백준 1987 C++  (1) 2024.10.18