티스토리 뷰

문제 링크 : https://www.acmicpc.net/problem/5622

 

5622번: 다이얼

문제 상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다. 전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다. 숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

www.acmicpc.net

문제 |

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

 

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

 

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 시간을 구하는 프로그램을 작성하시오.

 

입력 |

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어는 2글자~15글자로 이루어져 있다.

 

출력 |

첫째 줄에 다이얼을 걸기 위해서 필요한 시간을 출력한다.

 

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string ch;
	int count = 0;
	cin >> ch;
	for (int e : ch)
	{
		switch (e)
		{
		case 'A': case 'B': case 'C':
			count += 3; break;
		case 'D': case 'E': case 'F':
			count += 4; break;
		case 'G': case 'H': case 'I':
			count += 5; break;
		case 'J': case 'K': case 'L':
			count += 6; break;
		case 'M': case 'N': case 'O':
			count += 7; break;
		case 'P': case 'R': case 'Q': case 'S':
			count += 8; break;
		case 'T': case 'U': case 'V':
			count += 9; break;
		case 'W': case 'X': case 'Y': case 'Z':
			count += 10; break;
		}
	}
	cout << count << endl;
	return 0;
}

일단 내가 처음에 짠 이 코드는 단순무식하게 짠 코드이다. 그림에 나온 그대로 각 알파벳 다이얼을 걸기 위해 걸리는 시간을 일일히 Switch-Case문으로 지정하여 예외처리까지 한꺼번에 한 코드다. 달리 설명할 것도 없고 제3자가 보기에도 코드가 깔끔하고 별로 리뷰할 것이 없어 어떻게 보면 보기 쉬워서 좋다고 할 수도 있겠다. 하지만 이렇게 풀면 너무 재미가 없으니 다른 분들은 어떻게 풀었나 찾아보면서 코드를 다시 짜보았다.

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	char alpha[26] = { 0, };
	string ch;
	int result = 0, dial;
	cin >> ch;
	for (char e : ch)
	{
		alpha[e - 'A']++;
	}
	for (int i = 0; i <= 'Z' - 'A'; i++)
	{
		if (i == 'S' - 'A' || i == 'V' - 'A')
		{
			result += (i / 3 + 2) * alpha[i];
			continue;
		}

		if (alpha[i])
		{
			dial = i / 3 + 3;
			if (dial > 9)
			{
				result += 10 * alpha[i];
			}
			else
			{
				result += dial * alpha[i];
			}
		}
	}
	cout << result << endl;
	return 0;
}

이 코드로도 위의 출력 결과랑 똑같이 나와서 따로 이미지 파일은 넣지 않고 바로 리뷰하겠다. 각 다이얼마다 알파벳이 보통 3개씩 들어있으며 마지막 다이얼과 마지막에서 3번째에 위치한 다이얼 2개만 알파벳을 4개 가지고 있는 것을 활용한 코드이다.

 

A, B, C를 각각 0, 1, 2로 보고 3을 나누어주면 0이라는 결과가 나오고 여기서 3을 더하면 A, B, C를 걸기 위해 걸리는 시간인 3초가 딱 나온다. M, N, O까지만 해도 이 규칙이 잘 맞아떨어지다가 그 다음 다이얼에서 알파벳이 4개가 들어가면서 예외 사항이 생긴다. S는 본래 같은 다이얼에 있는 알파벳들보다 1초 더 걸린다. 다음 알파벳에 있는 V 또한 같은 다이얼에 있는 알파벳들보다 1초 더 걸린다. 이걸 이용해서 S와 V만 따로 예외처리해서 다른 알파벳들은 3을 더해주는걸 이 알파벳들만 2를 더해준다.

 

그럼 마지막 알파벳 4개는 어떡하냐고? 앞에 A, B, C를 0, 1, 2로 본 것처럼 V, W, X를 각각 21, 22, 23으로 볼 수 있으며 여기서 3을 나누고 이 몫에 3을 더하면 10이라는 숫자가 나온다. 원래는 V, W, X가 모두 10초가 걸려야하나, V가 예외처리 되었으므로 얘만 앞서 2를 더해서 9초가 걸리게끔 처리한다. 그리고 W부터는 모두 10초가 걸리게끔 if문을 사용해 3을 나누고 몫에 3을 더한 값이 9가 넘으면 무조건 10초가 걸린다고 분류해버리는 것이다. 그래서 Y, Z도 다이얼 거는데 10초가 걸린다고 분류된다.

 

알파벳을 다이얼 거는데 몇 초가 걸릴 지 분류하는 코드 앞에 알파벳이 각각 몇 개 있는지 분류해서 카운트하는 코드를 집어넣는다. 그리고 이 알파벳의 개수와 알파벳을 다이얼 거는데 걸리는 시간을 곱해서 result 결과 값에 차곡차곡 더해주고 마지막에 result를 출력하면 전체 다이얼을 거는데 걸리는 시간이 출력된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함