fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 3154 (C++) 알람시계
최초 업로드: 2025-07-16 09:07:13
최근 수정 시간: 2025-07-25 08:45:16
게시자: rlatjwls3333
카테고리: 백준
조회수: 7
# [Bronze I] 알람시계 [문제 링크](https://www.acmicpc.net/problem/3154) ## 문제 설명 <p>우리가 핸드폰으로 알람시계를 설정할 때는 시간과 분을 나타내는 4개의 숫자를 입력하기 위해 키보드를 사용한다. 예를 들어, 우리가 12:30으로 알람을 설정하려고 한다면 1,2,3,0을 입력하면 되고 9시30분 같은 경우는 맨 앞에 0을 붙여 0,9,3,0을 누르면 된다.</p> <p>그런데 얼마 전, 꿍은 알람시계를 맞추다가 시각을 잘못 입력했는데 화면에 나타나는 시간은 24로 나눈 나머지라는 것을 알게됐다. 마찬가지로 분 역시 60으로 나눈 나머지가 화면에 나타나는 사실을 알게됐다. 예를 들어 66:79로 시각을 잘못 입력했어도 실제로 화면에는 18:19로 나타난다는 것이다.</p> <p>꿍은 매우 게을러서 원하는 알람시각을 맞추는데 최소한의 노력만 하고싶다. 그래서 여러분들은 꿍이 어떻게 하면 최소한의 노력을 들여서 원하는 시각으로 알람을 맞출 수 있을지 알아내는 프로그램을 만들어야 한다.</p> <p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/91730349-4dba-40f8-8901-1b10949e9d75/-/preview/" style="width: 86px; height: 114px;"></p> <p>키보드는 위와 같이 생겼고 키 a에서 키 b로 이동할 때 필요한 노력은 다음과 같다.</p> <p style="text-align: center;">effort(a,b) = |x<sub>a</sub>-x<sub>b</sub>|+|y<sub>a</sub>-y<sub>b</sub>|</p> <p>여기서 (x<sub>a</sub>, y<sub>a</sub>) 와 (x<sub>b</sub>, y<sub>b</sub>)는 키a, b의 좌표를 나타낸다.</p> <p>전체 노력의 합은 첫 번째 키에서 두 번째 키로 이동하는데 필요한 노력, 두 번째 키에서 세 번째 키로 이동하는데 필요한 노력, 세 번째 키에서 네 번째 키로 이동하는데 필요한 노력의 세 값의 합으로 정의된다.</p> <p>예를 들어 22:45를 입력하는데 필요한 전체 노력의 값은 effort(2,2)+effort(2,4)+effort(4,5)=0+2+1=3. 이다.</p> <p>만약 답이 여러 가지라면 가장 빠른 시각을 출력하라.</p> ## 입력 <p>입력의 첫 번째 줄에는 HH:MM 형식으로 설정하고 싶은 시각이 주어진다. 만약 시간이나 분이 한 자리수라면 선행하는 0이 붙어야 한다.</p> <p>설정하고 싶은 시각은 00:00~23:59 중 하나이다.</p> ## 출력 <p>출력의 첫 번째 줄에는 HH:MM 형식으로 답을 출력한다. 한 자리의 수라면 선행하는 0을 붙여야 한다.</p> ## 풀이 #### 모든 수에 대해 각자의 거리를 미리 정해놓고 두자리 이하 시간에 대해 전부 탐색해주었다. ``` c++ #include<bits/stdc++.h> using namespace std; int effort[10][10] = { {0, 4, 3, 4, 3, 2, 3, 2, 1, 2}, {4, 0, 1, 2, 1, 2, 3, 2, 3, 4}, {3, 1, 0, 1, 2, 1, 2, 3, 2, 3}, {4, 2, 1, 0, 3, 2, 1, 4, 3, 2}, {3, 1, 2, 3, 0, 1, 2, 1, 2, 3}, {2, 2, 1, 2, 1, 0, 1, 2, 1, 2}, {3, 3, 2, 1, 2, 1, 0, 3, 2, 1}, {2, 2, 3, 4, 1, 2, 3, 0, 1, 2}, {1, 3, 2, 3, 2, 1, 2, 1, 0, 1}, {2, 4, 3, 2, 3, 2, 1, 2, 1, 0} }; int getEffort(string s) { int sum=0; for(int i=1;i<s.length();i++) { sum += effort[s[i-1]-'0'][s[i]-'0']; } return sum; } int main() { ios::sync_with_stdio(0); cin.tie(0); int h, m; char tmp; cin >> h >> tmp >> m; int minE = INT_MAX; string res; for(int i=0;h+i<100;i+=24) { for(int j=0;m+j<100;j+=60) { string nh = to_string(h+i); string nm = to_string(m+j); if(nh.size()==1) nh = "0" + nh; if(nm.size()==1) nm = "0" + nm; int e = getEffort(nh + nm); if(e<minE) { minE = e; res = nh + ":" + nm; } } } cout << res; } ```