Queue-ri/Advanced-Algorithm-Study

[Week 2] CLOCKSYNC self review - hanjuuuuuu

Closed this issue · 0 comments

CLOCKSYNC self review

1. 해결 시도 과정

스위치를 누르고 모두 12시로 맞춰졌는지를 확인하며 스위치 누른 횟수의 최솟값을 구하고자 하였습니다.
스위치별로 완전탐색을 하도록 시도하였습니다.

2. 아이디어

스위치를 4번 누를경우, 초기상태로 돌아오므로 스위치번호를 1씩 증가시키며 각각의 스위치를 i번씩 누르면서 모두 12시로 맞춰지는 경우가 있는지 확인합니다.
모두 12시로 맞춰진 경우, 그때까지 스위치를 누른 최솟값을 출력합니다.

3. 코드 설명

#include <iostream>
#include <algorithm>
using namespace std;

int clocks[16];
int c_switch[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 mins;		//최솟값 변수

void clocksync(int num, int count) //이전에 누른 스위치 번호, 스위치 누른 횟수 
{
	int flag = 1;
	for (int i = 0; i < 16; i++) {		// 모든 시계가 12시로 맞춰졌는지 확인
		if (clocks[i] != 12) {
			flag = 0;
			break;
		}
	}
	if (flag) {		//모든 시계가 12시로 맞춰졌다면 최솟값 확인
		if (count < mins)
			mins = count;
		return;
	}
	if (num >= 10)		//스위치 번호는 9까지 있으므로 10이상일 경우 return;
		return;

	for (int i = 0; i < 4; i++)		//스위치 별 4번씩 누른다.(4번누르면 초기의 값)
	{
		clocksync(num + 1, count + i); //스위치 번호를 증가시키며 재귀호출
		for (int j = 0; j < 5; j++) 
		{
			if (c_switch[num][j] != -1) //스위치가 시계번호를 가리킬 경우 해당 시계 값 증가
			{
				clocks[c_switch[num][j]] += 3;

				if (clocks[c_switch[num][j]] > 12)		//12가 넘어가면 12를 빼 3, 6, 9, 12로만 표현
					clocks[c_switch[num][j]] -= 12;
			}
		}
	}
}

int main() {
	int C;
	cin >> C;
	while (C--) {				//테스트케이스 수만큼 반복
		for (int i = 0; i < 16; i++) {		//시계입력
			cin >> clocks[i];
		}

			mins = 2e9;
			clocksync(0, 0);
			if (mins == 2e9)			//시계를 모두 12시로 돌리기가 불가능할 경우
				cout << -1;
			else
				cout << mins;
	}
	return 0;
}

4. 막힌 점 및 개선 사항

왜 오답인지 계속 찾아 헤맸었는데, 돌려보니 테스트케이스마다 출력이 바로 되어서인듯합니다.
코드를 개선하겠습니다.