그룹 단어 체커를 풀면서 당연하게도 나의 풀이는 장황하고 삥 돌아서 갔다. 그래서 다른 사람들 코드를 보던 중,
공통적으로 나오는 풀이가 있었다. 고마운 블로거 한명 덕분에 이해가 가기 시작했다.
두개를 비교해보았다.
a = int(input())
n = 0
for b in range(a):
f = True
c = input()
for b in range(len(c)):
if f==False:
break
d = c.index(c[b])
for e in range(len(c)):
if c[b] == c[e]:
if (e-d)<=1:
d = e
else:
f =False
break
if f == False:
continue
n+=1
print(n)
나의 풀이는 되게 복잡하게 생각했다. 내가 생각한 포인트는 연속적으로 문자가 나오는가?
만약 중복하는 문자가 있다면 전에 나왔던 문자랑 얼마나 멀리 떨어져있나 생각했다.
여기서 큰 역할은 한것은 d인데, index('문자') 했을 때 복수의 찾는 문자가 나올때 가장 앞에 있는 문자위치를 반환한다.
그래서 그것을 기준으로 삼아 다음 문자와 차이가 얼마나 나는지 비교했다. 한자리 차이면은 d의 기준을 새로 갱신해 갔다.
result = 0
for i in range(int(input())):
word = input()
print(sorted(word, key=word.find))
print(sorted(word, key=word))
if list(word) == sorted(word, key=word.find):
result += 1
print(result)
다수의 고수분들이 이와 같이 풀었다. sorted를 이용하여 단어를 정렬시키고 입력한 단어과 같을시 카운트하는 방식인 것 같다.
내가 이해가 가지 않았던 부분은 key=word.find부분이다.
그러나 백준에 질문글을 올렸고 답을 얻었다
답변해주신 ai4youej 님께 감사드립니다.
검색 결과 key는 각 요소들중에서 무엇으로 정렬할지 정하는 부분이라고 봤다.
sort(['b','c','a'], key = str.lower)
>>>['a','b','c']
위에는 문자열 소문자 기준으로 정렬한다.
근데 word.find는 처음 나오는 문자의 인덱스 값을 기준으로 정렬한다.
그래서 happy의 결과는 그대로 happy로 나오지만
abdeeddcc의 결과는
abdeeddcc
'a''b''d''d''d''e''e''c''c'
자세한 설명은 아래 블로거로부터 설명되어있다.
https://www.nemonein.xyz/2020/11/4551/
Python: sorted, key 의 작동 원리. – 바깥 세상으로
www.nemonein.xyz
내가 이해한 바로는 key부분은 호출가능한 함수를 적어야한다.그래서 반환되어 나온 값 기준으로 정렬한다.
lower()도 함수고 find()함수다.
그렇다면 word.find도 내가 이해한바로는 입력한 문자열 하나하나가 key함수로 들어가 반환된 문자 하나가 기준이 되어 정렬한다.
즉 만약 affedse를 입력했으면
우선 a기준으로 정렬하고, 다음 f 기준, 다시 f, e, 일케 쭉 가는데
e기준으로 정렬할때 멀리 떨어져있는 e를 델꼬와서 affee가 된다.
앞에서 보았듯이 key는 함수자리로, 함수에서 반환된 값을 기준으로 정렬을 한다.
asds을 입력하면, find()로 각 자리를 반환하면, 1232가 나온다. 중복되는 수가 나오면 find는 가장 앞에나온 자리값을 반환한다!
그래서 1232기준으로 정렬을 하면 1223이 되고 그게 assd가 되는 이유이다.
네이스
'알고리즘 문제들 으악 > 백준' 카테고리의 다른 글
[python]2775번, 역대급 길이 (0) | 2022.04.01 |
---|---|
[python]2869번, 수학잘하고 싶다 (0) | 2022.03.31 |
[python]1157,5622번 무지성의 정점 (0) | 2022.03.26 |
[python]10809번, continue break 그리고 ascii (0) | 2022.03.25 |
[python]1065번 내가 한 풀이 (0) | 2022.03.24 |