10월 2주차 #4

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

처음에 생각한건 i가 i 이후에 있는 뒤 모든 요소로 시작할 경우 False를 return하는 코드를 작성했는데 이 코드는 사실 이중 for문이라 작성하면서도 효율성은 안 좋겠구나 하는 생각을 했다. 그래도 일단 로직이 대충 맞는지 확인해보려고 내가 생각한대로 작성해보았다. 케이스는 전부 통과했고 역시 효율성은 통과 못했다.
원래는 startswith을 안 쓰고 in을 썼는데 생각해보니 in을 사용하면 접두사가 아니고 그냥 포함만 돼있어도 False로 판단을 해버려서 만약 in을 쓰려면 i+1번째 숫자를 i와 같은 길이만큼 자른 다음에 in이나 ==으로 판별해줘야할 것 같다.

이렇게 바꾼건 질문하기를 보다가 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(list, list[1:]) 이렇게 작성을 해주면 리스트 속의 요소를 i, i+1 이렇게 묶어준다! zip(list, list[2:]) 이렇게 쓰면 i, i+2 이렇게 묶어줌. 그래서 좀더 코드를 간단하게 쓸 수 있다. 사실 zip이 어떻게 동작하는지 몰라서 효율성이 어떻게 좋아지는지는 잘 모르겠다. 효율성 지키기는 너무 어렵다...
'코테 공부' 카테고리의 다른 글
| [파이썬] 프로그래머스 정렬 - K번째 수 (0) | 2021.10.12 |
|---|---|
| [파이썬] 프로그래머스 완전 탐색 - 소수 찾기 (0) | 2021.10.10 |
| [파이썬] 프로그래머스 힙(heap) - 더 맵게 (0) | 2021.10.06 |
| [파이썬] 프로그래머스 Summer/Winter Coding(2019) - 멀쩡한 사각형 (0) | 2021.10.05 |
| [파이썬] 프로그래머스 2019 카카오 블라인드 채용 - 오픈채팅방 (0) | 2021.10.04 |