티스토리 뷰
문제 링크
https://algospot.com/judge/problem/read/CLOCKSYNC
algospot.com :: CLOCKSYNC
Synchronizing Clocks 문제 정보 문제 그림과 같이 4 x 4 개의 격자 형태로 배치된 16개의 시계가 있다. 이 시계들은 모두 12시, 3시, 6시, 혹은 9시를 가리키고 있다. 이 시계들이 모두 12시를 가리키도록 바꾸고 싶다. 시계의 시간을 조작하는 유일한 방법은 모두 10개 있는 스위치들을 조작하는 것으로, 각 스위치들은 모두 적게는 3개에서 많게는 5개의 시계에 연결되어 있다. 한 스위치를 누를 때마다, 해당 스위치와 연결된 시계들
algospot.com
0번부터 9번까지의 스위치를 0~3번씩 누르는 모든 경우의 수를 완전탐색으로 모든 시계가 12시가 되는 최소 버튼의 수를 구합니다. 스위치를 4번 누르는 것은 한 바퀴를 도는 것이기 때문에 스위치마다 최대 3번 이상은 누르지 않아도 되기 때문입니다.
이 경우 4^10 = 1048576개의 경우의 수가 나오기 때문에 제한 시간안에 모든 경우의 수를 탐색해볼 수 있습니다.
구현 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
const int INF=9999, SWITCHES = 10, CLOCKS = 16; | |
//10개의 스위치 | |
const char linked[SWITCHES][CLOCKS+1] = { | |
"xxx.............", | |
"...x...x.x.x....", | |
"....x.....x...xx", | |
"x...xxxx........", | |
"......xxx.x.x...", | |
"x.x...........xx", | |
"...x..........xx", | |
"....xx.x......xx", | |
".xxxxx..........", | |
"...xxx...x...x.." | |
}; | |
//모든 시계가 12시를 가리키고 있는지 확인 | |
bool areAligned(const vector<int>& clocks){ | |
for(auto it : clocks){ | |
if(it != 12){ | |
return false; | |
} | |
} | |
return true; | |
} | |
//swtch번 스위치를 push | |
void push(vector<int>& clocks, int swtch){ | |
for(int clock=0;clock<CLOCKS;++clock){ | |
if(linked[swtch][clock] == 'x'){ | |
clocks[clock] += 3; | |
if(clocks[clock] == 15) | |
clocks[clock] = 3; | |
} | |
} | |
} | |
int solve(vector<int>& clocks, int swtch){ | |
//경우의 수를 모두 탐색했을 때 모든 시계가 12시에 맞춰져있지 않다면 INF를 반환 | |
if(swtch == SWITCHES) | |
return areAligned(clocks) ? 0 : INF; | |
int ret = INF; | |
//swtch번 스위치를 0번에서 3번까지 누르는 경우를 탐색 | |
for(int cnt=0;cnt<4;++cnt){ | |
ret = min(ret, cnt+solve(clocks,swtch+1)); | |
push(clocks,swtch); | |
} | |
return ret; | |
} | |
int main(){ | |
int test_case; | |
cin >> test_case; | |
while(test_case--){ | |
vector<int> clock(16); | |
for(int i=0;i<16;i++){ | |
cin >> clock[i]; | |
} | |
int result = solve(clock,0); | |
cout << (result == INF ? -1 : result) << endl; | |
} | |
} |
'Coding Test > 알고스팟' 카테고리의 다른 글
[C++] 알고스팟/분할정복 - 쿼드 트리 뒤집기 (0) | 2020.03.30 |
---|---|
[C++] 알고스팟/비트마스크 - 졸업 학기 (0) | 2020.03.29 |
[C++] 알고스팟/완전탐색 - 게임판 덮기 (0) | 2020.01.11 |
[C++] 알고스팟/완전탐색 - 소풍 (0) | 2020.01.10 |
[C++] 알고스팟/유클리드 - 마법의 약 (0) | 2020.01.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- HiveQL
- pyspark
- 외발 뛰기
- 합친 lis
- 알고스팟
- 백준
- python
- Jaeha's Safe
- 삼각형 위의 최대 경로 수 세기
- 2225
- 삼각형 위의 최대 경로
- 하이브
- 배열과 문자열
- Hadoop
- 팰린드롬 구하기
- Sqoop
- 스파크
- 출전 순서 정하기
- 분할정복
- 종만북
- Django
- 코딩인터뷰 완전분석
- import
- HDFS
- 완전탐색
- microwaving lunch boxes
- 하둡
- C++
- hive
- 두니발 박사의 탈옥
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함