[파이썬] 프로그래머스LV1 최소직사각형

청수동햄주먹·2023년 2월 3일
0

파이썬코딩테스트

목록 보기
2/35

프로그래머스 코딩테스트 연습 최소직사각형

첫번째 시도 때 쉽게 푼 문제이지만 성능 최적화가 전혀 안됐다는 생각이 든다.

def solution(sizes):
    big = []
    small = []
    for x,y in sizes:
        big.append(max(x,y))
        small.append(min(x,y))
    return sorted(big)[-1]*sorted(small)[-1]

지역변수로 리스트 두개에 for룹 돌려서 요소들을 추가하고 각각 소트해서 마지막 값 접근까지..

생각해보니 리스트를 쓸 이유가 전혀 없었다. 각 명함사이즈의 큰 변과 작은 변중 제일 큰값만 업데이트해주면 되어서 바꾸어 주었다

def solution(sizes):
    big = 0
    small = 0
    for x,y in sizes:
        mx = max(x,y)
        mn = min(x,y)
        if(big < mx):
            big = mx
        if(small < mn):
            small = mn
    return big * small

다른 사람의 풀이 중 몇개를 추려 보았다

def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)

간단하면서도 한눈에 논리의 흐름이 보여서 좋은 것 같다

solution = lambda sizes: max(sum(sizes, [])) * max(min(size) for size in sizes)

람다를 쓰는 것은 아직 자신이 없기 때문에..

성능

            첫번째 시도	            개선된코드	                한줄코드	                람다
테스트 1 〉	통과 (0.00ms, 10.3MB)	통과 (0.00ms, 10.2MB)	통과 (0.00ms, 10.3MB)	통과 (0.01ms, 10.1MB)
테스트 2 〉	통과 (0.01ms, 10.2MB)	통과 (0.00ms, 10.2MB)	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.2MB)
테스트 3 〉	통과 (0.01ms, 10.3MB)	통과 (0.00ms, 10.2MB)	통과 (0.01ms, 10.1MB)	통과 (0.01ms, 10.2MB)
테스트 4 〉	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.1MB)
테스트 5 〉	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.2MB)
테스트 6 〉	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.1MB)
테스트 7 〉	통과 (0.01ms, 10.3MB)	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.2MB)	통과 (0.01ms, 10.1MB)
테스트 8 〉	통과 (0.02ms, 10.2MB)	통과 (0.01ms, 10.1MB)	통과 (0.01ms, 10.2MB)	통과 (0.02ms, 10.1MB)
테스트 9 〉	통과 (0.03ms, 10.2MB)	통과 (0.01ms, 10.2MB)	통과 (0.02ms, 10.3MB)	통과 (0.02ms, 10.1MB)
테스트 10 〉	통과 (0.09ms, 10.2MB)	통과 (0.03ms, 10.3MB)	통과 (0.04ms, 10.3MB)	통과 (0.09ms, 10.2MB)
테스트 11 〉	통과 (0.10ms, 10.1MB)	통과 (0.06ms, 10.2MB)	통과 (0.07ms, 10.2MB)	통과 (0.17ms, 10.2MB)
테스트 12 〉	통과 (0.24ms, 10.3MB)	통과 (0.09ms, 10.3MB)	통과 (0.11ms, 10.2MB)	통과 (0.21ms, 10.2MB)
테스트 13 〉	통과 (0.89ms, 10.3MB)	통과 (0.29ms, 10.3MB)	통과 (0.49ms, 10.2MB)	통과 (1.71ms, 10.4MB)
테스트 14 〉	통과 (1.13ms, 10.5MB)	통과 (0.58ms, 10.4MB)	통과 (0.63ms, 10.4MB)	통과 (6.69ms, 10.4MB)
테스트 15 〉	통과 (2.74ms, 10.6MB)	통과 (0.88ms, 10.4MB)	통과 (0.97ms, 10.3MB)	통과 (17.35ms, 10.6MB)
테스트 16 〉	통과 (3.94ms, 10.9MB)	통과 (1.47ms, 10.6MB)	통과 (1.49ms, 10.5MB)	통과 (46.64ms, 10.9MB)
테스트 17 〉	통과 (4.87ms, 11.1MB)	통과 (2.00ms, 10.9MB)	통과 (3.55ms, 10.8MB)	통과 (101.70ms, 11.2MB)
테스트 18 〉	통과 (7.67ms, 11.3MB)	통과 (2.26ms, 10.9MB)	통과 (2.54ms, 10.8MB)	통과 (142.15ms, 11.3MB)
테스트 19 〉	통과 (5.64ms, 11.7MB)	통과 (2.47ms, 11.4MB)	통과 (3.21ms, 11.4MB)	통과 (233.73ms, 11.9MB)
테스트 20 〉	통과 (9.49ms, 11.6MB)	통과 (3.12ms, 11.3MB)	통과 (5.83ms, 11.3MB)	통과 (267.63ms, 11.9MB)
  • 개선된 코드가 가장 좋은 성능을 보여주었다. 확실히 자료구조를 만들지 않고 정수로만 다뤄야 빠르다
  • 한줄 코드가 시간적으로 두번째로 짧은 성능을 보여주었다. 아무래도 forloop 두번이 된 셈이 차이가 있는 것 같음..
  • 람다코드가 테스트 17~20에서 확연히 느린성능을 보여주었다... 왜징?
profile
코딩과 사별까지

0개의 댓글