https://www.acmicpc.net/problem/10809
10809번: 알파벳 찾기
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출
www.acmicpc.net
s = input()
d = {}
for index, value in enumerate(s): # 딕셔너리 작성
if d.get(value) is None:
d[value] = index
for i in range(ord("a"), ord("z")+1): # 출력
print(d.get(chr(i),-1), end=" ")
위의 코드중에 처음엔 if부분을 보자.
if d.get(value) is None의 의미는
"d 딕셔너리에 value 키가 없다면" 라는 의미로 사용했다.
이 문제로 참 많이 헤맸다.
왜냐면 처음에 if not(d.get(value)) 으로 했었기 때문이다.
원인을 찾기가 힘들었다.
d.get(value)가 값이 있다면 True로 나올테고
not()메소드로 인해 반대로 바뀌기 때문에
값이 있다면 -> Fasle
값이 없다면 -> True
로 판단되어 if문 안으로 진입할 것이라 생각했었다.
어리석었다.
d.get(value)가 0이 나올수도 있다는걸 한참을 생각하다 새벽이 되어서야 깨달았다.
위의 코드대로라면 0을 하나의 값으로 판단하게 되는 것이다.
하지만 암묵적 타입변환에 의해 0이 나오면 False가 나온다는 사실은 기본중의 기본 상식.
그래도 깨달으니 기분이 좋다.
사실 이 문제를 30일 전에도 푼 적이 있었다.
그때 는 단순히 문자열메소드의 find()를 이용해서 풀었다.
s = input()
d = {}
for c in s:
d[c] = s.find(c)
for i in range(ord("a"), ord("z")+1):
print(d.get(chr(i),-1), end=" ")
문자열 길이가 최대 100자를 넘기지 않는다고 명시되어있고 시간제한도 1초라서
무지성 find()를 쓰더라도 넉넉하게 통과가 된다.
s = input()
for i in range(ord("a"), ord("z")+1):
print(s.find(chr(i)), end=" ")
'알고리즘 > 백준-파이썬' 카테고리의 다른 글
[백준] 2743번 (python 파이썬) (0) | 2022.04.09 |
---|---|
[백준] 10820번 (python 파이썬) (0) | 2022.04.09 |
[백준] 10808번 (python 파이썬) (0) | 2022.04.08 |
[백준] 1935번 (python 파이썬) (0) | 2022.04.08 |
[백준] 1918번 (python 파이썬) (0) | 2022.04.08 |