코테 공부

[파이썬] 프로그래머스 해시 - 전화번호 목록

yekim8 2021. 10. 9. 23:36

10월 2주차 #4

 

문제

내가 생각하는대로 했더니 효율성에서 틀려서 다른 사람 풀이를 참고했다.

 

효율성 통과 못한 풀이1

처음에 생각한건 i가 i 이후에 있는 뒤 모든 요소로 시작할 경우 False를 return하는 코드를 작성했는데 이 코드는 사실 이중 for문이라 작성하면서도 효율성은 안 좋겠구나 하는 생각을 했다. 그래도 일단 로직이 대충 맞는지 확인해보려고 내가 생각한대로 작성해보았다. 케이스는 전부 통과했고 역시 효율성은 통과 못했다.

원래는 startswith을 안 쓰고 in을 썼는데 생각해보니 in을 사용하면 접두사가 아니고 그냥 포함만 돼있어도 False로 판단을 해버려서 만약 in을 쓰려면 i+1번째 숫자를 i와 같은 길이만큼 자른 다음에 in이나 ==으로 판별해줘야할 것 같다.

효율성 통과 못한 풀이2

이렇게 바꾼건 질문하기를 보다가 string과 int/float 등등 숫자형의 정렬 순서가 다르다는 걸 알았기 때문이다. string은 아스키코드 값을 비교한 걸로 나열이 돼서 정렬을 시키면 사전순으로 정렬이 된다.

예를 들어서 1, 10, 3, 33이 네 숫자를 int로 정렬시키면 1, 3, 10, 33순으로 정렬이 되지만 string으로 정렬시키면 1, 10, 3, 33 순으로 정렬이 된다. 그렇기 때문에 만약 i+1이 i로 시작하지 않는다면 i로 시작하는 string은 더이상 없는 것이다. 그래서 핵심은! 전체 배열이 아닌 i+1번째 요소만 i로 시작하는지 확인하면 된다. 굳이 for문을 두 번 도는게 아니라 한 번만 돌면 풀 수 있다. 그래서 이 방법으로 혹시 효율성을 통과할 수 있을까 생각했는데 이 방식으로도 효율성은 통과하지 못했다. 어쩔 수 없이 다른 사람이 푼 방식을 확인했다.

 

효율성 통과한 풀이

가장 처음 나오는 풀이였다. 이 풀이는 zip을 사용했는데 사실 zip을 대충 알고는 있지만 이런 식으로 활용하는 것을 본 적이 없어서 생각도 못했던 방법이었다. zip에 대해서 검색해도 막 많이 나오는 편은 아니라 문제를 여러번 풀면서 활용법을 익히는게 좋을 것 같다.

zip

이런 식으로 zip(list, list[1:]) 이렇게 작성을 해주면 리스트 속의 요소를 i, i+1 이렇게 묶어준다! zip(list, list[2:]) 이렇게 쓰면 i, i+2 이렇게 묶어줌. 그래서 좀더 코드를 간단하게 쓸 수 있다. 사실 zip이 어떻게 동작하는지 몰라서 효율성이 어떻게 좋아지는지는 잘 모르겠다. 효율성 지키기는 너무 어렵다...