백준 웹사이트 "5622번 - 다이얼" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#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'의 첫 세 배열 요소에는 공백을 넣었기에 각 소배열의 인덱스가 그 문자를 누를 때 걸리는 시간입니다.
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 1316번 - 그룹 단어 체커 (0) | 2022.01.13 |
---|---|
[백준/C언어] 2941번 - 크로아티아 알파벳 (0) | 2022.01.12 |
[백준/C언어] 2908번 - 상수 (0) | 2022.01.11 |
[백준/C언어] 1152번 - 단어의 개수 (0) | 2022.01.11 |
[백준/C언어] 1157번 - 단어 공부 (0) | 2022.01.10 |