BOJ | 10809번

송치헌·2021년 6월 25일
0
post-thumbnail

Python 풀이

풀이 1.

S = input() #단어 입력
alpha_dict = {chr(97+i):-1 for i in range(26)} #알파벳 소문자의 개수(26개)만큼의 크기의 딕셔너리 생성(key : 알파벳 소문자, value = -1)
for i in range(len(S)-1,-1,-1): #단어 S의 뒤에서부터 for문 돌림(이유는 단어의 i번째 알파벳이 처음 나온 인덱스를 저장해야 하므로)
    alpha_dict[S[i]] = i #딕셔너리에 value값 i를 저장
for k in alpha_dict.keys(): #keys() 함수로 key에 접근해서 value를 출력
    print(alpha_dict[k],end=' ')

여러 풀이 방법이 있지만 가장 처음 생각 난 방법으로 풀어보았다.
dictionary로 각 알파벳 소문자와 인덱스를 묶어서 관리하는게 편해보였다.
그래서 일단 각 알파벳을 key, -1을 value로 설정해 놓고 단어 S의 마지막 문자부터 처음 문자까지 역방향으로 돌면서 단어의 n번째 문자를 key로 value를 n으로 바꿔주었다. 그렇게 하면 처음 나온 문자의 인덱스를 저장할 수 있어서 거꾸로 for문을 돌려주었다. (처음부터 끝까지 순방향으로 해주면 나중에 나온 문자의 인덱스가 저장된다. 예를들어 start의 경우 s, a, r은 한번씩 밖에 안나오기 때문에 상관 없지만 t는 처음에 1, 두번째에 4가 되어서 결국 t가 4로 저장이 된다. 그러면 문제의 의도와 달라지므로 역방향으로 돌린다.)

그 다음 dictionary의 key값들을 모아서 각 key값으로 value값을 출력해주면 끝. (참고로 alpha_dict.keys()를 해주면 그 dictionary의 key값들을 모아놓은 컨테이너가 생성된다. type(alpha_dict.keys())를 출력해 주면 <class 'dict_keys'>가 나오는데 dict_keys라는 컨테이너가 따로 새로 생기는 것 같다...이걸 쓰기 싫으면 list(alpha_dict.keys())로 리스트로 만들어서 쓰면 된다.

풀이 2.

S = input()
alpha = 'abcdefghijklmnopqrstuvwxyz'
for i in alpha:
    print(S.find(i),end=' ')

다른 사람들의 풀이도 봤는데 find함수를 이용해서 푸셨다. 그래서 나도 사용해 봤는데 알파벳이 포함되어있지 않으면 -1을 출력해야 하는데 그 부분이 없는 것을 보니 find(something)을 했을 때 찾지 못하면 -1를 리턴하는 것 같다. (실제로 -1을 리턴한다.) 그리고 찾았을 때는 그 문자에 해당하는 인덱스를 반환한다(가장 처음 나오는 문자의 인덱스). 이렇게 풀라고 만든 문제인 것 같다.

C++ 풀이

풀이 1.

#include <string>
#include <iostream>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string S;
    cin >> S;
    int alpha[26];
    int idx = 0;
    fill(alpha, alpha + 26, -1);
    for (int i = 0; i < 26; i++) {
    	for (int j = 0; j < S.size(); j++) {
            if (S[j] - 97 == i) {
    	    	alpha[i] = j;
    	    	break;
    	    }
    	}
    }
    for (int i : alpha) {
    	cout << i << " ";
    }
}

풀이 2.

#include <string>
#include <iostream>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string S;
    cin >> S;

    string alp = "abcdefghijklmnopqrstuvwxyz";
    for (char c : alp) {
    	if (S.find(c) != string::npos) cout << S.find(c) << " ";
    	else cout << -1 << " ";
    }
}
profile
https://oraange.tistory.com/ 여기에도 많이 놀러와 주세요

0개의 댓글