https://www.acmicpc.net/problem/5622
1. 문제
문제
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.
출력
첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.
2. 풀이
#include <stdio.h>
#include <string.h>
int main(){
int i, j, k, check, nowNum = 0, result = 0;
// 각 숫자에 입력된 문자열을 저장하기 위해 2차원 배열을 선언한다.
char word[8][4] = {
{65, 66, 67, '0'},
{68, 69, 70, '0'},
{71, 72, 73, '0'},
{74, 75, 76, '0'},
{77, 78, 79, '0'},
{80, 81, 82, 83},
{84, 85, 86, '0'},
{87, 88, 89, 90},};
// 입력한 값을 받기 위한 문자열 배열을 선언.
char input[16] = {0,};
scanf("%s", input);
int len = (int)strlen(input);
// 입력 받은 문자열의 길이만큼 반복
for (i = 0 ; i < len ; i++){
nowNum = input[i];
check = 0;
// 인덱스 0번부터 8번까지 반복하되,
for (j = 0 ; j < 8 ; j++){
// check 값이 1이라면 for문 break.
if (check == 1) break;
else{
// 각 인덱스에 들어간 문자를 확인해서
for (k = 0 ; k < 4 ; k++){
// 그 값이 input[i]와 같다면
if(nowNum == word[j][k]){
// 인덱스 0번이 전화기 숫자 2번이며 1초가 추가로 걸리기에
// result 값에 (j + 3)을 더함
result += (j + 3);
check = 1;
break;
}
}
}
}
}
printf("%d\n", result);
}
3. 메모
이번 문제 역시 하나 배워갈 수 있었다. 이중 for문을 사용해서 코드를 작성했는데, 나는 값이 체크가 되면 이중 for문을 모두 break 하고 싶었다. JAVA의 경우,
// JAVA
Loop1:
for (int a = 0 ; a < c ; a++){
Loop2:
for (int b = 0 ; b < d ; b++) break Loop1;
}
각 for문에 라벨을 지정해주고 해당 for문의 라벨명을 break 해서 for문을 빠져나올 수 있다. 하지만..
C는 break를 통해선 중첩 for문을 빠져나올 수 없다..
하지만 모로 가도 서울만 가면 된다고, goto를 사용하면 중첩 for문을 빠져나올 수 있다..!!
int main(){
int check = 0;
for (int i = 0 ; i < 10 ; i++){
for (int b = 0 ; b < 10 ; b++){
if (check == 1){
goto EXIT;
}
num++;
}
}
EXIT :
printf("%d", num);
}
특정 조건을 만족할 때, for문을 빠져나가고 싶다면 그 조건 아래 'goto EXIT;'를 적어주면 된다. 여기서 EXIT는 하나의 레이블 이름으로, 꼭 EXIT라 적지 않아도 된다. 부기부기는 위에서부터 코드를 쭉쭉 읽다가 check의 값이 1일 때라는 if문 조건을 충족하게 되면 앞뒤 신경 쓰지 않고 바로 EXIT 레이블로 넘어간다. 레이블만 있다면 어디든 갈 수 있다는 게 'goto'의 가장 큰 장점이지만 어떤 이유인지 많은 분들이 goto 사용을 지양하라고 하신다.. 왜일까...? 왜 째서..
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[C] 그룹 단어 체커 (백준 알고리즘 1316번) (0) | 2021.08.16 |
---|---|
[C] 크로아티아 알파벳 (백준 알고리즘 2941번) (0) | 2021.08.11 |
[C] 상수 (백준 알고리즘 2908번) (0) | 2021.07.24 |
[C] 단어의 개수 (백준 알고리즘 1152번) (0) | 2021.07.24 |
[C] 단어공부 (백준 알고리즘 1157번) (0) | 2021.07.23 |