본문 바로가기
코딩과 알고리즘

백준알고리즘 2037 문자 메시지 해설 및 소스

이번엔 좀 재미난 문제입니다 :)

영어로 된 문자자판에서 문자 메시지를 보내는 데 걸리는 시간을 측정하는 소스를 짜는 것인데요.

https://www.acmicpc.net/problem/2037

 

2037번: 문자메시지

문제 오른쪽 그림과 같은 핸드폰 자판이 있다. 이 자판을 이용하여 어떤 영어 메시지를 치려고 할 때, 걸리는 최소 시간을 구하는 프로그램을 작성하시오. 단, 1번은 누를 경우에는 공백이 찍힌다고 하자. 그리고 만약에 AC라는 문자를 치려 한다면 A를 치고 난 후 일정 시간을 기다린 후 C를 치면 된다. 하나의 문자를 입력하려면, 버튼을 눌러야 한다. 버튼을 누르면 버튼에 쓰여 있는 문자가 입력되며, 버튼을 누를 때 마다 다음 문자로 바뀌게 된다. 예를 들

www.acmicpc.net

문제 설명이 좀 어려운데, 아마도 풀이결과를 보고 유추하는 문제인듯 합니다.

하지만 크레이가 좀 더 풀어서 설명드리겠습니다 :)



다음과 같은 제약이 있습니다.

A 를 입력하려면 2키를 1번

B 를 입력하려면 2키를 2번

C 를 입력하려면 2키를 3번 눌러야 합니다.



그리고 바로 전과 동일한 숫자판의 영어를 이어서 입력할 때는 기다려야 합니다.

이를테면 2번 키를 눌러 A 를 바로 전에 입력했다면,

다음 A 또는 B 또는 C 를 입력하려면 일정시간 기다려야 합니다.

하지만 A를 입력했다가 D를 입력할 때는 기다릴 필요가 없습니다.

D키는 3숫자판에 있으니까요.



그리고 번호판을 한번 누를때마다 시간이 소요됩니다.



p 와 w 가 처음에 주어지는데요.

p 는 press 의 약어, w 는 wait의 약어로 의미를 둔 듯 합니다.

p 가 2초 걸리고, w가 10초 걸린다고 할 때,



ABCDE 를 입력한다면, 아래와 같은 시간이 소요됩니다.



A - 2초

B - 10초 기다리고 + 2초 x 2 = 14초

C - 10 초 기다리고 + 2초 x 3 = 16초

D - 2초

E -  10초 기다리고 + 2초 x 2 = 14초



총 소요시간 : 48초입니다.



다만 띄어쓰기는 무조건 2초입니다.



이를테면 A와 C 를 띄어쓰면 C 를 입력할 때 대기시간이 없습니다.

A - 2초

띄어쓰기 - 2초

C - 2초 x 3



백준 사이트에서 예제로 주어진 것도 각 버튼의 누름 시간에는 아래와 같은 시간이 소요됩니다.



A - 2초

B - 10초대기 + 2초 x 2 = 14초

B - 10초대기 + 2초 x 2 = 14초

A  - 10초대기 + 2초 = 12초

S - 2초 x 4 = 8초

띄어쓰기 - 2초

S - 2초 x 4 = 8초

A - 2초

L - 2초 x 3 = 6초

A - 2초

M - 2초



총 72초가 되는 것이지요

이 과정을 시뮬레이션하는 것입니다.



문제 이해가 좀 더 수월해졌으리라 생각되며,

이 상태에서 한번 도전해보실분 도전해보세요 :)



소스 공개합니다 ~

#include <iostream>
#include <cstring>

void Result()
{
	int p, w;
	scanf("%d %d\n", &p, &w);
	char s[1001];
	scanf("%[^\n]s", s);
	int size=strlen(s);
	char number[26]={
		2, 2, 2,	// ABC
		3, 3, 3,	// DEF
		4, 4, 4,	// GHI
		5, 5, 5,	// JKL
		6, 6, 6,	// MNO
		7, 7, 7, 7,	// PQRS
		8, 8, 8,	// TUV
		9, 9, 9, 9	// WXYZ
	};
	char press[26]={
		1, 2, 3,	// ABC
		1, 2, 3,	// DEF
		1, 2, 3,	// GHI
		1, 2, 3,	// JKL
		1, 2, 3,	// MNO
		1, 2, 3, 4,	// PQRS
		1, 2, 3,	// TUV
		1, 2, 3, 4	// WXYZ
	};
	long time=0;
	for(int i=0;i<size;++i)
	{
		// 대기시간 계산
		if(i>0 && isalpha(s[i]) && isalpha(s[i-1]))
			if(number[s[i]-'A']==number[s[i-1]-'A'])
				time+=w;
		// 누르는 시간 계산
		if(isalpha(s[i]))time+=press[s[i]-'A']*p;
		else time+=p;
	}
	printf("%ld", time);
}

int main()
{
	Result();
	getchar(); getchar();
}