Bakjoon Q10809 - C++
Q10809
Problem
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
Input
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
Output
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, … z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
예제 입력
1
baekjoon
예제 출력
1
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
나의 제출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include<memory.h>
using namespace std;
int main(){
int alp[26], i=0; //alp = 26개
memset(alp, -1, sizeof(int)*26); //-1로 초기화
string let;
cin >> let; //입력한 단어
while(let[i]){ // loop끝나고 ++, 즉 철자 수만큼 반복
int temp = let[i]; // char을 숫자로서 즉 a면 97 b면 98로 저장
if(alp[temp-97]==-1){
alp[temp-97]=i;
}
i++;
}
for(int v : alp) printf("%d ", v);
}
추가 내용
일단 루프 두번 돌리는 멍청한 짓을 안해서 아주 만족스러웠던 문제. 일단 착안했던 점들에 대해 설명하자면,
-
loop는 string의 letter수 만큼만 iterate 시키면 됐다. 그래서 어짜피 letter index 밖은 null이 오므로 while 안에 let[i]를 넣었다.
-
indexing을 해서 첫글자에 0 두번째 글자에 1 이런식으로 진행하면 됐다.
-
그렇게 진행하려면 multi loop가 아니라 단일방향으로 한번 돌리고 종료시켜야 했다.
-
그래서 입력받은 값(char)을 int형으로 고치고, 이에서 97(ascii 상으로 a)을 빼면 a를 입력받은 경우 index를 0으로 지정할 수 있었다.
-
따라서 입력받은 값에 맞게 index를 대응시켰고, 마침 또 i가 letter 위치(0부터 시작)와 딱 맞아서 그냥 대입만 해줬다.
-
근데 문제점이 중복되는 letter에 대해서 어떻게 검증할 것이냐였는데, 만약 alp array가 -1로 초기화되어있지 않은 경우 이미 등장한 경우이므로 if문으로 -1인 경우에만 새로운 입력을 받도록 했다. ___
-
그 외 마지막 출력 루프는 range-based for loop를 이용해서 간결히 표현했다.
-
26번 루프돌리면서 초기화하기 싫어서 memset이라는 함수를 통해 -1로 초기화시켰다.
총평
솔직히 꽤 만족스러웠음. 이것저것 잡지식 다 동원해서 깔끔하게 푼 문제 굳굳!!