본문 바로가기

코딩/백준 BOJ

[백준/C언어] 5622번 - 다이얼

백준 웹사이트 "5622번 - 다이얼" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <string.h>

int main(void){
    char dial[11][5] = {"","","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};

    char word[16];
    scanf("%s", word);

    int len_word = strlen(word);
    int time = 0;
    for(int i=0; i<len_word; i++){
        char letter = word[i];
        //printf("%c ", letter);
        for(int j=0; j<11; j++){
            if(strchr(dial[j], letter) != NULL){
                //printf("%d %s\n", j, dial[j]);
                time += j;
            }
        }
    }
    printf("%d\n", time);
}

문제 풀이

  문제를 풀기 위해 저만의 '다이얼'을 만들어줍니다. Line 5와 같이 "ABC", "DEF" 등등 같은 숫자에 해당되는 문자들끼리 묶어줍니다. 여기서 사용하는 배열은 2차원 배열인데, 첫 번째 대괄호 [11]은 세로 크기를 의미하며 두 번째 대괄호 [5]는 가로 크기를 의미합니다. 즉 2차원 배열 'dial' 안에는 11개의 작은 배열이 있으며, 작은 배열 하나는 크기가 5인 셈입니다. 크기 11의 큰 배열은 3개의 공백과 8개의 문자 묶음을 만들어주기 위함이며, 크기 5의 작은 배열은 문자 묶음 하나의 최대 길이인 4("PQRS" 와 "WXYZ")를 담아주기 위함입니다. 이때 4가 아니라 5인 이유는, 하나의 문자묶음 끝에는 "\0"으로 표시되는, 보이지 않는 표식이 있습니다. 이 표식이 없으면 배열 요소끼리 구분이 되지 않기 때문에, 꼭 담아주어야 합니다. Line 7에서 입력 단어의 최대 크기가 15임에도 불구하고 1만큼 더 큰 16을 배열의 크기로 지정하는 것 역시 같은 이유 때문입니다.

   Line 10 ~ 21은 입력된 단어의 문자를 하나씩 읽어, 'dial' 내에서의 위치를 확인하여 시간을 계산하는 과정입니다. 이때 Line 16에서 쓰인 'strchr' 함수는 string(문자열)과 char(문자)을 입력받으면 string 안에 char이 존재하는지 확인하는 함수입니다. 만약 존재한다면 그 char에게 향하는 포인터를 반환하며, 존재하지 않는다면 NULL 포인터를 반환합니다. 따라서 strchr(dial[j], letter) != NULL의 의미는 dial[j]에 letter이 존재하는지 확인하고, 존재한다면(NULL이 아니라면) C언어에서의 true를 뜻하는 1을 반환합니다. 정리하면, Line 15 ~ 20의 for문의 의미는 dial의 각 문자 묶음을 확인하여, 해당 문자가 존재하는 문자 묶음의 인덱스를 'time'에 더해줍니다. 'dial'의 첫 세 배열 요소에는 공백을 넣었기에 각 소배열의 인덱스가 그 문자를 누를 때 걸리는 시간입니다.

반응형