알고리즘 문제들 으악/백준

[python]1316번, key=word.find 알아냈다.

빈나 2022. 3. 27. 20:49
반응형

그룹 단어 체커를 풀면서 당연하게도 나의 풀이는 장황하고 삥 돌아서 갔다. 그래서 다른 사람들 코드를 보던 중,

공통적으로 나오는 풀이가 있었다. 고마운 블로거 한명 덕분에 이해가 가기 시작했다.

두개를 비교해보았다. 

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가 되는 이유이다.

네이스

반응형