ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14891 톱니바퀴
    Algorithm/구현(Brute force, Back tracking, etc.) 2021. 11. 16. 20:42
    728x90

    - 무난한 구현문제이다. (백준 골드5)

     

    - 8개의 톱니 * 4개의 톱니바퀴 * 최대 100의 회전 수를 해서 시간복잡도는 신경쓰지 않아도 된다.

     

    - 한 번의 회전이 일어날 때 마다, 각 톱니바퀴들이 어느 방향으로 회전 할 지를 조사하여 일괄적으로 변화시키도록 구현한다.

     

    - 처음 톱니의 상태를 입력을 받을 때, string 타입의 vector로 받는다. 그 후, 회전시킬 톱니바퀴와 방향을 입력받는다. 톱니바퀴를 기준으로 왼쪽에(혹은 오른쪽에) 있는 톱니들로 이동하면서 회전 여부 및 어느 방향으로 회전을 할 지를 vector d에 담아서 처리한다.

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    int main() {
    	int n = 4;
    	vector<string> a(n); // 8방향의 톱니바퀴를 다 구해주고
    	for (int i = 0; i<n; i++) {
    		cin >> a[i];
    	}
    	int k;
    	cin >> k;
    	while (k--) {
    		int no, dir; // 회전시킬 톱니바퀴 및 방향
    		cin >> no >> dir;
    		no -= 1; // index에 맞추기 위해. 1번째 톱니바퀴의 index는 0이 된다.
    		// 각각의 톱니는 동시에 회전해야 하기 때문에
    		// 먼저, 각 톱니가 어떤 방향으로 회전해야 하는지 구하자
    		vector<int> d(n); // 어떤 방향으로 회전 할 지가 담기는 벡터
    		d[no] = dir;
    		// 왼쪽 톱니를 연쇄적으로 구하고
    		for (int i = no - 1; i >= 0; i--) {
    			if (a[i][2] != a[i + 1][6]) {
    				d[i] = -d[i + 1];
    			}
    			else {
    				// 한 톱니가 회전하지 않으면
    				// 그 톱니의 왼쪽에 있는 톱니도 회전하지 않는다.
    				break;
    			}
    		}
    		// 오른쪽 톱니를 연쇄적으로 구하고
    		for (int i = no + 1; i<n; i++) {
    			if (a[i - 1][2] != a[i][6]) {
    				d[i] = -d[i - 1];
    			}
    			else {
    				// 한 톱니가 회전하지 않으면
    				// 그 톱니의 오른쪽에 있는 톱니도 회전하지 않는다.
    				break;
    			}
    		}
    		for (int i = 0; i<n; i++) {
    			if (d[i] == 0) continue;
    			if (d[i] == 1) {
    				// 시계 방향 회전
    				char temp = a[i][7];
    				for (int j = 7; j >= 1; j--) {
    					a[i][j] = a[i][j - 1];
    				}
    				a[i][0] = temp;
    			}
    			else if (d[i] == -1) {
    				// 반시계 방향 회전
    				char temp = a[i][0];
    				for (int j = 0; j<7; j++) {
    					a[i][j] = a[i][j + 1];
    				}
    				a[i][7] = temp;
    			}
    		}
    	}
    	int ans = 0;
    	for (int i = 0; i<n; i++) {
    		if (a[i][0] == '1') {
    			ans |= (1 << i);
    		}
    	}
    	cout << ans<< '\n';
    	return 0;
    }

    'Algorithm > 구현(Brute force, Back tracking, etc.)' 카테고리의 다른 글

    백준 15694 사다리 조작  (0) 2021.11.17
    백준 15683 감시  (0) 2021.11.17
    백준 14890 경사로  (0) 2021.11.16
    백준 14889 스타트와 링크  (0) 2021.11.15
    백준 14888 연산자 끼워넣기  (0) 2021.11.15

    댓글

Designed by Tistory.