해결된 질문
작성
·
267
·
수정됨
2
기존코드
def two_sum(nums, target):
memo = {}
for v in nums:
memo[v] = 1
for v in nums:
needed_number = target - v
if needed_number in memo:
return True
return False
기존 코드에서 첫번째 for문은 O(n)이고
두번째 for문은 O(1)이 n번 실행되니까 최종적으로는 O(n)이 되어서 해당 알고리즘의 시간복잡도는 O(n)이되는데
처음에 문제를 설명해주실때의 순서대로라면 4를 먼저넣고 target이 14니까 10이 있는지 확인해보고 없으니까 1을 넣고 13이없는지 확인해보고 없으니까 9를 넣고 5가 없으니까 7을 넣고 7이 없으니까 5를 넣고 9가 있으니까 true를 반환 이라고 생각을 했고 그렇게 로직을 짜면 아래와 같은 코드가 될것같습니다(제가 파이썬을 잘 몰라서 정확한지는 모르겠네요 ㅠㅠ)
def two_sum(nums, target):
memo = {}
for v in nums:
memo[v] = 1
needed_number = target - v
if needed_number in memo:
return True
return False
해당 코드에서는 첫번째 for문 내부의 시간복잡도가 전부다 O(1)이고 그걸 n번 반복하는것이니 O(n)이라는 최종적인 시간복잡도라고 생각을 하는게 맞을까요??
만약에 아래에 짠 로직이 올바른 로직이라면
위에 로직은 n번 연산하면서 dictionary에 넣고 후에 요소를 돌면서 답을 찾고
아래로직은(코드가 맞다면) dictionary를 다 넣지 않더라도 중간에 값이 나오면 중간에 연산을 끝낼 수 있으니까 조금더 효율적이라고 생각을 했습니다
제가 생각한 방식이 맞는지 그리고 이런 작은(?)효율성이 코딩테스트에서 의미있게 다가올지가 궁금합니다!
답변 1
0
안녕하세요 의성님.
두 접근 방식 모두 시간 복잡도는 O(n)으로 동일합니다. 그러나 실제 성능에서는 약간의 차이가 있을 수 있습니다 첫 번째 방법은 모든 요소를 memo
에 먼저 저장하고, 그 후에 필요한 숫자를 찾는 코드라서 항상 모든 요소를 두 번 확인하게 됩니다. 반면, 수정된 방법은 가능한 한 빨리 True
를 반환할 수 있습니다. 이는 최선의 경우 (즉, 조건을 만족하는 쌍이 빨리 발견될 경우)에는 더 빠르게 작동할 수 있습니다.
하지만 코딩테스트에서는 시간복잡도만 잘 맞춘다면 이정도의 최적화는 보통 필요하지 않습니다. 물론 대회를 준비한다면 이정도의 최적화가 유의미할 수 있지만, 기업용 코테에서는 둘중에 더 빨리 구현할 수 있는 방법으로 하시면 됩니다.
하나 확실한건 코드 하나하나 작성할 때 이정도로 생각하시면서 연습하면 실력 늘리는데에는 정말 도움 많이 될 거에요!
또 궁금한점있으면 질문 남겨주세요 :)
정말 빠른답변 감사합니다!!!
항상 코딩테스트 하면서 머릿속에 드는 이런 의문이 생기면 물어볼 사람이 없어서 답답했던 경험이 많았는데 이렇게 빠르고 정확한 답변을 받으니까 좋네요:)
가끔은 이런 생각을 그냥 넘어가지못해서 코테공부를하는데 '비효율적으로 하는게아닌가...'라는 생각이 많이들었었는데 격려해주셔서 감사합니다!