이 문제도 시간이 많이 걸렸다.
최근에 느낀 것이지만 문제를 풀 때 이상하게 append와 pop을 많이 사용하는 경향이 있었는데,
왜 그런가 고민해보니 C언어스럽게 나도 모르게 파이썬 코드를 짜고 있었다는 것을 알게 되었다.
스트링이나 숫자들을 모두 리스트에 넣고, 리스트의 인덱스를 사용해서 만드는 방법이 대표적으로 C언어스럽다는 것이다.
이 문제도 결국 그렇게 풀고,
문제 푼 코드의 지저분함을 느끼고 계속 쳐다본 결과 그렇게 된 것 같다.
그리고 코드를 볼 때 참고해야할 사항이 몇 가지 있는데...
1. 조건인 constraint를 제대로 읽지 않았다. 알고보니 testcase의 입력값들이 모두 양수로 되어있다는 것이었다. 음수값의 경우도 모두 처리해야하는 줄 알고 if elif else문을 사용했다.
2. contraint를 알고 원래 만들었던 코드를 그대로 사용해보았더니 그래도 지저분했다.
3. 그래서 파이써닉한 코드를 한 번 만들어보고 "remove()" 함수를 알게 되어 "pop"대신 사용할 수 있게 되었다.
-그동안 pop()을 계속 사용한 이유는 remove()를 제대로 몰랐기 때문.
-pop()은 index값을 넣어야 하고, remove()는 지우고자 하는 숫자/문자를 넣으면 된다.
4. 마지막의 코드는 sort()를 사용한 것인데, 가장 간단하고 직관적인 코드이다. 다만, 효율성을 배제하고 생각해야 한다. 시간적인 면에서는 가장 느리다는 특징이 있다.
#constraint 제대로 확인 안하고 음수까지 모두 처리 (77ms)
class Solution:
def maxProduct(self, nums: List[int]) -> int:
nums_abs = [abs(ele) for ele in nums] # 절대값으로 바꾼다. O(n)
nums_abs is ...
list of abs(ele) for each ele in nums
dictionary of ...
top_maxIndex = nums_abs.index(max(nums_abs))
top_positive_max = nums_abs.pop(top_maxIndex)
next_maxIndex = nums_abs.index(max(nums_abs))
next_positive_max = nums_abs.pop(next_maxIndex)
if nums[top_maxIndex] > 0 and nums[next_maxIndex] > 0:
return ((top_positive_max-1) * (next_positive_max-1))
elif nums[top_maxIndex]<0 and nums[next_maxIndex]<0:
return ((top_positive_max-1) * (next_positive_max-1))
else:
if nums[top_maxIndex] < 0:
nums.pop(next_maxIndex)
# print("if", nums[top_maxIndex])
return ((max(nums)-1) * (next_positive_max-1))
else:
nums.pop(top_maxIndex)
# print("else", nums[next_maxIndex])
# print((max(nums)))
return ((max(nums)-1) * (top_positive_max-1))
# constraint 제대로 보고 처리하면 다음과 같은 코드 가능(66ms)
class Solution:
def maxProduct(self, nums: List[int]) -> int:
top_maxIndex = nums.index(max(nums))
top_positive_max = nums.pop(top_maxIndex)
next_maxIndex = nums.index(max(nums))
next_positive_max = nums.pop(next_maxIndex)
return ((top_positive_max-1) * (next_positive_max-1))
class Solution:
def maxProduct(self, nums: List[int]) -> int:
mx = max(nums)
nums.remove(mx)
next_mx = max(nums)
# nums.remove(next_mx)
return (mx-1)*(next_mx-1)
# 더 짧고 빠르게 sort()를 활용하여 하면 다음과 같은 코드
# 그런데 sort() 함수가 속도가 많이 느린 것인지 속도 자체는 위의 2개의 코드 중 제일 느리게 나온다 (101ms)
# 효율성을 떠나 가장 파이썬스러운 코드
class Solution:
def maxProduct(self, nums: List[int]) -> int:
nums.sort()
return (nums[-1]-1) * (nums[-2]-1)
출처: https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/
'Leetcode' 카테고리의 다른 글
[leetcode] 144. Binary Tree Preorder Traversal Python (0) | 2022.05.08 |
---|---|
[leetcode] 104. Maximum Depth of Binary Tree Python (0) | 2022.05.07 |
[leetcode] 643. Maximum Average Subarray I Python (0) | 2022.04.07 |