[백준] 10809, 알파벳 찾기, s.find(s1) + 루프 변수를 char로 쓰기

YUN·2026년 2월 20일

C++

목록 보기
33/85


풀다보니 매우 좋은 풀이가 있어서 가져와봤다.

1. 나의 풀이

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int arr[26];
    fill(arr+0, arr+26, -1);
    string s;
    cin >> s;
    for(int i=0; i<s.size(); i++) {
        if(arr[s[i]-'a']==-1) arr[s[i]-'a']=i;
    }
    for(int a : arr) cout << a << " ";
    return 0;
}

나는 이렇게 풀었다.

fill() 로 배열을 -1로 초기화하고, 문자열을 순회하며 값이 -1인 인덱스의 요소를 문자열에서 등장 위치로 설정했다.

(아스키코드를 활용해 char를 int로 변환했다)

지금 보면 굳이 안써도되는 배열과 fill()을 써서 비효율적인 코드인듯하다.

2. 다른 사람의 풀이

#include <iostream>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string s;
    cin >> s;
    for(char i = 'a'; i<= 'z'; i++) cout << (int)s.find(i) << " ";
    return 0;
}

코드가 정말 단순, 깔끔하다.

불필요하게 배열을 사용하지 않는다.

string으로 입력을 받고, for문의 루프 변수를 char로 써써 s.find()'a' 부터 'z' 까지 순서대로 넣어가며 특정 문자의 문자열상에서 위치를 찾는다.

문제 출력 조건 중

(1) a~z까지 순서대로 출력해야 한다는 것은 'for문의 루프 변수를 char로 써써 s.find()'a' 부터 'z' 까지 순서대로 넣기' 로 만족하고,

(2) 처음 등장하는 위치를 출력해야함은 앞에서 부터 탐색을 시작하는 s.find()로 만족시키고,

(3) 등장하지 않은 문자는 -1을 출력해야한다는 조건은 (int)s.find(s1) 으로 만족시킨다.

매우 효율적인 풀이인듯하다.

특히 for문 루프 변수로 보통 int를 쓰는데 char를 사용해서 쉽게 알파벳을 순서대로 함수에 인자로 전달하는것이

매우 인상적이었다.

3. 느낀 점

다른 사람의 더 좋은, 더 깔끔한 풀이를보고 다양한 풀이 방법을 접하는 것이 좋은 것 같다.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글