Algorithm

[프로그래머스] Level1 | 최소직사각형 - 파이썬(Python) | 위클리 챌린지, 얕은 복사와 깊은 복사

토오오끼 2021. 12. 4. 15:24
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/86491

 

코딩테스트 연습 - 최소직사각형

[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120 [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

programmers.co.kr


 

가로가 세로보다 작은 경우에는 회전을 시켜서 보관을 할 수 있기 때문에 가로와 세로의 값을 변경하도록 했다.

이 과정이 for문 안에서 실행이 되었고 이 때 가로와 세로의 값을 변경 하면 기존 값에 덧씌워지기 때문에 제대로 변경이 되지 않는다. 때문에 똑같은 값을 가진 sizes를 복사한 리스트가 필요했다.

 

여기서 슬라이싱으로 복사([:])를 하니 for문 안에서 실행되던 결과랑 똑같이 제대로 값이 덧씌워지지 않았다.

찾아보니 얕은 복사와 깊은 복사의 차이가 있었다.

슬라이싱으로 복사를 한 건 얕은 복사였고 내부 객체들까지 새롭게 복사되는 깊은 복사를 사용해야만 제대로 값을 변경할 수 있었다.

얕은 복사와 깊은 복사는 https://wikidocs.net/16038 이 링크에서 자세하게 설명하고 있어서 참고하여 이해를 할 수 있었다.

 

정답 코드

import copy

def solution(sizes):
    answer = 0
    sizes_list = copy.deepcopy(sizes)
    
    w_list = []
    h_list = []
    for i in range(len(sizes_list)) :
        if sizes_list[i][0] < sizes_list[i][1] :
            sizes_list[i][0] = sizes[i][1]
            sizes_list[i][1] = sizes[i][0]
        w_list.append(sizes_list[i][0])
        h_list.append(sizes_list[i][1])
    
    answer = max(w_list) * max(h_list)
    
    return answer

여기서 copy 모듈을 import하여 copy.deepcopy로 깊은 복사를 사용하여 sizes 리스트를 복사했다.

때문에 sizes_list와 sizes는 값만 같고 내부 객체까지 다른 서로 다른 각각의 리스트가 되었다.

그래서 for문 내에서 sizes_list에 sizes의 값을 각각 할당해도 sizes_list나 sizes에 서로 영향을 미치지 않아 원하는 결과대로 가로와 세로의 값을 변경할 수 있었다.

 


해당 문제 풀이 코드

 

GitHub - YOOHYOJEONG/algorithm_practice: 알고리즘 공부 및 코딩테스트 준비

알고리즘 공부 및 코딩테스트 준비. Contribute to YOOHYOJEONG/algorithm_practice development by creating an account on GitHub.

github.com

 

728x90
반응형