KoreanFoodie's Study

SW 역량테스트 - [백준] 톱니바퀴 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 톱니바퀴 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 9. 29. 11:45


SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!

해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다. 

코드에 대한 설명은 주석을 참고해 주세요 :)

 


문제 링크 : www.acmicpc.net/problem/14891

해답 코드 : 

 

#include <iostream>
#include <deque>
#include <vector>

using namespace std;

int K;
deque<int> gear[4];
int dir[4];
// direction of each gear
// 1 : clockwise
// -1 : counter-clockwise
// 0 : stay still

// clockwise turn
void clock(deque<int> g) {
	int temp = g.back();
	g.pop_back();
	g.push_front(temp);
}

// counter-clockwise turn
void c_clock(deque<int> g) {
	int temp = g.front();
	g.pop_front();
	g.push_back(temp);
}

int main() {

	int g_t;
	int ans = 0;

	for (int i = 0; i < 4; i++) {
		
		cin >> g_t;

		for (int j = 0; j < 8; j++, g_t /= 10) {
			
			gear[i].push_front(g_t % 10);
		}
	}

	cin >> K;

	int rotate[100][2];
	int temp_gear;

	for (int i = 0; i < K; i++) {
		cin >> temp_gear;
		rotate[i][0] = temp_gear - 1;
		cin >> rotate[i][1];
	}


	int cur_gear;
	int cur_dir;

	//dir[0] = 0; dir[1] = 0; dir[2] = 0; dir[3] = 0;

	// rotate
	for (int rt = 0; rt < K; rt++) {

		cur_gear = rotate[rt][0];
		cur_dir = rotate[rt][1];

		dir[cur_gear] = cur_dir;

		// compute direction, ->
		for (int i = cur_gear; i < 3; i++) {
			if (gear[i][2] == gear[i + 1][6]) {
				dir[i + 1] = 0;
				cur_dir = 0;
			} // different
			else {
				dir[i + 1] = cur_dir * -1;
				cur_dir *= -1;
			}
		}

		// restore direction
		cur_dir = rotate[rt][1];

		// compute direction, <-
		for (int i = cur_gear; i > 0; i--) {
			if (gear[i][6] == gear[i - 1][2]) {
				dir[i - 1] = 0;
				cur_dir = 0;
			} // different
			else {
				dir[i - 1] = cur_dir * -1;
				cur_dir *= -1;
			}
		}

		int temp;

		for (int i = 0; i < 4; i++) {
			
			if (dir[i] == 1) {
				temp = gear[i].back();
				gear[i].pop_back();
				gear[i].push_front(temp);
			}
			else if (dir[i] == -1) {
				temp = gear[i].front();
				gear[i].pop_front();
				gear[i].push_back(temp);
			}
			else {
				continue;
			}
		}


	}

	for (int i = 0, j = 1; i < 4; i++, j *= 2) {
		ans += gear[i][0] * j;
	}

	cout << ans;

}

 

SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)

SW 역량테스트 준비 - C++ 코드, Java 코드

SW 역량테스트 준비 - 백준 알고리즘 문제

Comments