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())
로 리스트로 만들어서 쓰면 된다.
S = input() alpha = 'abcdefghijklmnopqrstuvwxyz' for i in alpha: print(S.find(i),end=' ')
다른 사람들의 풀이도 봤는데 find
함수를 이용해서 푸셨다. 그래서 나도 사용해 봤는데 알파벳이 포함되어있지 않으면 -1을 출력해야 하는데 그 부분이 없는 것을 보니 find(something)
을 했을 때 찾지 못하면 -1를 리턴하는 것 같다. (실제로 -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 << " "; } }
#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 << " "; } }