김펭귄 관찰일기
article thumbnail

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

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

 

1. 문제


💡 문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

💡 입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

💡 출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

 

 

2. 풀이


#include <stdio.h>

int main(){
    int i, j;
    char word[101] = {0,};
    
    scanf("%s", word);
    
    // 알파벳 'a' ~ 'z'
    for (i = 97 ; i <= 122 ; i++){
        for (j = 0 ; j < 101 ; j++){
            
            // 읽어온 문자열이 현재 체크 중인 알파벳일 때, 현 위치 (j)를 출력 후 break
            if (word[j] == i){
                printf("%d ", j);
                break;
            }
            // 체크 중인 알파벳을 찾지 못해 문자열 끝의 널문자까지 체크했다면, '-1' 출력 후 break
            else if (word[j] == '\0'){
                printf("-1 ");
                break;
            }
        }
    }
}

 

 

3. 메모


 저번 포스트에 이어, 이번 포스트도 scanf와 관련된 문제이다. 저번 문제와 굉장히 유사해 쉽게 풀 수 있었지만, 아직 scanf 사용이 익숙지 않아 중간에 발목을 잡혔다.

 

scanf("%s", word);

for (int i = 0 ; i < 100 ; i++){
	scanf("%c", word);
}

 

 이 둘의 차이점은 무엇일까. 난 습관적으로 한 글자씩 받아오려고 for문을 사용했다. 하지만 무엇인가 어색한 것을 볼 수 있다. 테스트를 위해 10번 반복하도록 코드를 조금 수정했다.

 

어랴랴..

 abcdefg를 입력하고 엔터를 눌렀지만 저번 포스트와 유사하게 입력이 끝나질 않는다. 당황해 엔터를 연달아 입력하니 뭐 결과가 나오긴 하는데 살짝 내가 의도한 바와 다르다. 가만히 생각해보니 역시 인간은 망각의 동물. 그새 까먹은 것이다.. 헤헤..

 

 for (int i = 0 ; i < 10 ; i++)로 작성했으니, 당연히 부기부기는 한 글자 ("% c")씩 끊어서 읽을 테지. a, b, c, d, e, f, g. 이렇게 7번 받긴 했는데 아직 값 3개가 입력되지 않았으니 기다리는 것이 당연했다. 그러다 엔터를 연달아 입력했다고 했는데 부기부기는 그 값을 ('\0') 인덱스 7번부터 9번까지 넣었고 그리하여 아래처럼 출력되는 것이다...!! 한 마디로 word [7] = '\0', word [8] = '\0', word [9] = '\0'인 상태이다.

 

 자, 그럼 생각을 해보자..

for (int i = 0 ; i < 10 ; i++) scanf("% c", word [i]);

scanf("% c", word);

 

 for문을 사용해 scanf 한다면 그 값의 남은 수만큼 엔터를 쳐야 할 것 같고.. 그냥 scanf만 하자니 한 문자만 받아올 것이 분명하다. '어..? 그러면 % xc를 쓰면 되지 않을까?' 하고 생각했지만 (물론 되긴 됩니다만..) 그건 너무 귀찮다. 내가 입력할 문자열 크기는 제각각 일 텐데 어느 세월에 또 값을 바꾸고 한담.

 정답은 아주 간단했다. 바로바로 scanf("% s", word)를 쓰는 것이다..!!

 

오오... 찬양하라... 오오...

 한 가지 주의해야 할 점이 있는데, 나처럼 단어 길이가 100이 넘지 않는다고 word [100], 이렇게 선언하면 백준에서 틀렸다고 나온다. 우리는 string을 사용했기에 단어가 100자리일 경우를 생각해서 '\0'문자가 들어갈 인덱스를 하나 더 만들어 줘야 한다.

profile

김펭귄 관찰일기

@Penguin.Kim