๐Ÿ˜‰/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์™„์ „ํƒ์ƒ‰(CLOCKSYNC)

ruhz 2020. 7. 28. 17:16
 

algospot.com :: CLOCKSYNC

Synchronizing Clocks ๋ฌธ์ œ ์ •๋ณด ๋ฌธ์ œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 4 x 4 ๊ฐœ์˜ ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ๋ฐฐ์น˜๋œ 16๊ฐœ์˜ ์‹œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ์ด ์‹œ๊ณ„๋“ค์€ ๋ชจ๋‘ 12์‹œ, 3์‹œ, 6์‹œ, ํ˜น์€ 9์‹œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. ์ด ์‹œ๊ณ„๋“ค์ด ๋ชจ๋‘ 12์‹œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๏ฟฝ๏ฟฝ

algospot.com

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> answer;

const int button[10][5] = {
	{0, 1, 2, -1, -1},
	{3, 7, 9, 11, -1},
	{4, 10, 14, 15, -1},
	{0, 4, 5, 6, 7},
	{6, 7, 8, 10, 12},
	{0, 2, 14, 15, -1},
	{3, 14, 15, -1, -1},
	{4, 5, 7, 14, 15},
	{1, 2, 3, 4, 5},
	{3, 4, 5, 9, 13}
};
int myClock[16] = {0, };
int level;
int maxLevel;

// ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  clock์˜ ์›์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋„๊ตฌ
void pressButton(int n, int a) {
	// n์€ ๋ฒ„ํŠผ ๋ฒˆํ˜ธ, a๋Š” +3 ๋˜๋Š” -3์œผ๋กœ, ๋ฐฐ์—ด์— ๋”ํ•  ์ˆซ์ž
	if (a == 0) return;

	for (int i = 0; i < 5; i++) {
		if (button[n][i] == -1)
			break;
		else {
			myClock[button[n][i]] += a;
			// ์‹œ๊ณ„๊ฐ€ ๋ฒ”์œ„ ์™ธ์˜ ์ˆซ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด ์ฃผ๊ธฐ(12)๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ์ˆ˜์ •
			if (myClock[button[n][i]] % 12 < 3) {
				myClock[button[n][i]] %= 12;
				myClock[button[n][i]] = 12 + myClock[button[n][i]];
			}
			else
				myClock[button[n][i]] %= 12;
		}
	}
}

// ์‹ค์ œ ๋™์ž‘์„ ํ•˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜
void run(int n) { 
	/* clock์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ 12๊ฐ€ ๋˜๋ฉด level์„ maxLevel๊ณผ ๋น„๊ต ํ›„ ๋ฐ˜ํ™˜
	 * ๋ฒ„ํŠผ ๋ฒˆํ˜ธ๊ฐ€ 9๊ฐ€ ๋„˜์–ด๊ฐ€๋„ ๋ฐ˜ํ™˜
	 */
	bool flag = false;
	for (int i = 0; i < 16; i++)
		if (myClock[i] != 12)
			flag = true;
	if (!flag) {
		if (level < maxLevel)
			maxLevel = level;
		return;
	}
	if (n > 9) return;

	/* ๊ฐ ๋ฒ„ํŠผ๋‹น 0๋ฒˆ~3๋ฒˆ์”ฉ ๋ˆŒ๋Ÿฌ๋ณด๊ณ , ๋ˆ„๋ฅธ๋งŒํผ level์— ๋”ํ•ด์ค€๋‹ค.
	 * ๋‹ค์Œ ๋ฒ„ํŠผ์„ run ํ•ด์ค€๋‹ค.
	 * ์‹คํŒจํ–ˆ๋‹ค๋ฉด run()์ดํ•˜ ์ฝ”๋“œ๋กœ ์›์ƒ๋ณต๊ตฌ๋˜๋ฉฐ, ๋‹ค์Œ ํšŒ์ฐจ ์‹œ๋„
	 */
	for (int i = 0; i < 4; i++) {
		pressButton(n, 3*i);
		level += i;
		run(n + 1);
		pressButton(n, -3*i);
		level -= i;
	}
	return;
}

int main() {
	int tc;
	cin >> tc;
	while (tc > 0) {
		for (int i = 0; i < 16; i++)
			cin >> myClock[i];
		level = 0;
		maxLevel = 100;
		run(0);
		// ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด -1 ๋ฐ˜ํ™˜
		if (maxLevel == 100)
			maxLevel = -1;
		answer.push(maxLevel);
		tc--;
	}
	while (!answer.empty()) {
		cout << answer.front() << endl;
		answer.pop();
	}
	return 0;
}

'๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ˆœ์„œ๋Š” ์ „ํ˜€ ์ƒ๊ด€์—†๋‹ค'

 

๋ฌธ์ œ๋ฅผ ์ ‘ํ•˜๊ณ  ๋ฌด์ž‘์ • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ๊ฒฐ๊ตญ ์‹œ๊ฐ„์€ ๋ง์…ˆ์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์„ 0ํšŒ, 1ํšŒ, 2ํšŒ, 3ํšŒ ๋ˆŒ๋Ÿฌ๋ณด๋ฉฐ ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๋ฒ„ํŠผ์„ ์žฌ๊ท€ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค.

 

โ€‹์ถ”๊ฐ€์ ์œผ๋กœ button[]๊ณผ ๊ฐ™์ด ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์กฐ๊ฑด์€ const๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋˜ <ctime.h>์— clockํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…(myClock)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ฑ„์  ์‹œ ์ปดํŒŒ์ผ ์‹คํŒจ๊ฐ€ ๋‚˜์˜ค๋‹ˆ ์ฐธ๊ณ .

 

 

ruhz3/CodingTest

To prepare for coding test. Contribute to ruhz3/CodingTest development by creating an account on GitHub.

github.com