초보 개발자의 이야기, 릿허브

[C] 백준 14405번 피카츄 본문

코딩테스트/📗 백준 (BOJ)

[C] 백준 14405번 피카츄

릿99 2021. 7. 22. 09:08
728x90
반응형
1. 문제이해

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

 

14405번: 피카츄

피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다. 문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문

www.acmicpc.net

 

피카츄는 pi, ka, chu의 세 음절을 합친 단어만 이야기 할 수 있다.

문자열을 입력받고, 피카츄가 말할 수 있는 문자인지 아닌지를 판별하는 알고리즘을 구현하는 것이 목표이다.

 

 

 

2. 문제풀이

 

피카츄는 pi, ka, chu 세 음절로만 이야기할 수 있다는 것에서,

각 음절의 첫단어인 p, k, c를 기준으로 코드를 구현해야겠다고 생각했다.

문자열을 입력받아 배열에 저장하고,

배열의 요소가 위 세 알파벳 중 하나이면 뒤의 단어도 이어서 확인하는 방식으로 구현하기로 했다.

 

 

 

3. 소스코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAX 5000
int main() {

	int i;
	int right;	// pi, ka, chu가 제대로 입력됐는지 구분하기 위한 정수
	char pikachu[MAX];	// 입력받은 문자열을 저장하는 배열
    
	scanf("%s", pikachu);
	
	for (i = 0; i < strlen(pikachu); i++) {
		// pi
		if (pikachu[i] == 'p') {
			if (pikachu[i + 1] == 'i') {
				right = 1;
			}
			else {
				right = 2;
				break;
			}
			i++;
		}
		// ka
		else if (pikachu[i] == 'k') {
			if (pikachu[i + 1] == 'a') {
				right = 1;
			}
			else {
				right = 2;
				break;
			}
			i++;
		}
		// chu
		else if (pikachu[i] == 'c') {
			if (pikachu[i + 1] == 'h') {
				if (pikachu[i + 2] == 'u') {
					right = 1;
				}
				else {
					right = 2;
					break;
				}
			}
			else {
				right = 2;
				break;
			}
			i += 2;
		}

		else {
			right = 2;
			break;
		}
	}

	// right을 보고 맞는지 아닌지 판별
	switch (right) {
	case 1:
		printf("YES");
		break;

	case 2:
		printf("NO");
		break;
	}

	return 0;
}

문제를 이해하고 어떻게 구현해야 할지는 느낌이 금방 왔는데, 막상 구현해보니 생각만큼 쉽지는 않았다..

우선 문자열을 입력받은 다음 pikachu 라는 배열에 저장한 후,

위에서 이야기했듯이 p, k, c를 기준으로 우선 if 문을 이용해 경우를 나눠주었다.

배열 안의 문자가 다음과 같으면,

이어지는 문자도 같은지 확인하고, 모두 같으면 right에 1, 같지 않으면 2를 대입했다.

 

처음에 각 if문마다 i++, i++, i += 2 해주지 않아 제대로 원하는 출력값을 내주지 못했었다.😥

위와 같은 처리를 해주지 않으면, 예를 들어 pi를 입력했을 경우,

pikachu[0] 은 p이고 pikachu[1]이 i이니, right에 1을 대입해주어 YES를 출력해줄것같지만,

마지막에 i++이 없으므로, pikachu[2]를 검사하지 않고 pikachu[1]을 다시 검사, 이는 i이므로

마지막 else문에 걸려 right에 2가 저장되고, 결과적으로 NO를 출력하게 된다.

때문에, 모두 맞거나, 중간에 틀리더라도 pi, ka는 두 글자이므로 i++, chu는 세 글자이므로 i+=2를 해주어

해당 음절을 다시 검사하는 것을 방지해야한다.

 

위와 같은 과정을 거쳐, 제대로된 음절만으로 이루어진 문자열이 입력되었다면 right이 1, 아니라면 2가 되므로,

switch문을 이용해 각각 YES, NO를 출력해주었다.

 

 


제목이 피카츄라서 귀여워서 구현했는데, 문제는 귀엽지 않았다..

요즘 되도록이면 하루에 하나씩 문제를 풀어나가는 연습을 하고 있는데,

문제가 비교적 쉬우면 괜찮지만, 어려우면 하루의 시작이 피곤해지는 느낌이다..😶

사실 첫번째 문제였던 다리놓기가 너무 어려웠어서,

(런타임에러라던지, 시간초과라는 문구를 10번은 본것같다.)

아직까지는 할 만 한것같기도 하고..

지금은 실버5 단계 문제를 주로 풀이중인데, 점차 단계도 올려나갈까 생각중이다.

나는 실버5 문제도 아직 어려운데, 윗 단계 높은 문제들 구현하시는 분들 보면 새삼 대단하시구 존경스럽다.

프로필 문구처럼, 언젠가는 나도 진화하겠지..?😭

 

 

 

728x90
반응형