이 문제도 시간이 많이 걸렸다.

최근에 느낀 것이지만 문제를 풀 때 이상하게 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/

 

Maximum Product of Two Elements in an Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

+ Recent posts