프로그래머스 파이썬 기초 트레이닝 :: 특별한 이차원 배열 2 (list(map(list, zip(*arr))))



      

              


    문제 설명 

    프로그래머스 URL

    https://school.programmers.co.kr/learn/courses/30/lessons/181831



    프로그래머스 코딩 카테고리 

    코딩 기초 트레이닝

    Day 25 - 특별한 이차원 배열 2

    Lv.0



    문제 내용 

    n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

    0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]


    arr1 : [[5, 192, 33], [192, 72, 95], [33, 95, 999]]

    result1 : 1 

    arr2 : [[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]]

    result2 : 0



    문제 이해

    일반방식) 이중 for문을 돌면서, arr[i][j] = arr[j][i] 이 값이 같은지 확인 

    zip함수) arr를 unpacking(*arr)하고, zip함수로 행,열 바꿈  




    -----------------------------------



    일반 코드 

    이중 for문으로 값 확인

    def solution(arr):
        for i in range(len(arr)) : 
            for j in range(len(arr)) : 
                if arr[i][j] != arr[j][i] :
                    return 0
        return 1 


    위의 코드 간결version

    def solution(arr):
        return int(all(arr[i][j] == arr[j][i] for i in range(len(arr)) for j in range(len(arr))))



    이중 for문을 사용해도되지만, zip(*arr) 함수를 써서 행열을 바꿀수있다. 

    고수 코드 

    map함수와  zip(*arr) 함수  

    def solution(arr):
        return int(arr == list(map(list, zip(*arr))))



    *arr : unpacking

    arr = [[5, 192, 33], [192, 72, 95], [33, 95, 999]]

    2차원 배열로 싸여져있는, arr를 *arr로 unpacking하면 한곁을 벗긴다는 식으로 생각하면 된다. 



    arr[0][1] 하면 0행 1열의 데이터에 접근이 가능하지만,

    *arr는 이미 한곁이 벗겨진 상태이기 때문에 *arr[0][1] 으로는 접근이 불가능하다. 


    그리고, zip(*arr)했을때는 for문으로 각 열의 데이터에 바로 접근이 가능하다. 

    arr= [[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]]
        for a, b, c, d in zip(*arr) :
            print(a, b, c, d)
    
    >> 19 63 258 587
    >> 498 93 7 754
    >> 258 7 1000 723
    >> 587 754 723 81


    zip함수 

    zip함수는 두개 이상의 함수 합칠때 사용하고, 

    같은 인덱스에 있는 요소들을 묶어서 튜플로 반환하는 특징이 있다.

    리턴값으로는 zip 객체 자체를 반환하기 때문에 list형변환 또는 tuple 형변환이 필요하다


    names = ['Alice', 'Bob', 'Charlie']
    ages = [25, 30, 35]
    print(zip(names, ages))
    
    >> <zip object at 0x7f3c7afdc840>

    print(zip(arr1, arr2))를 했을때 출력값은 zip 객체이다.


    names = ['Alice', 'Bob', 'Charlie']
    ages = [25, 30, 35]
    print(list(zip(names, ages)))
    
    >> [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

    list(zip(arr1, arr2)) 해야지 배열이 된다. 

    이렇게, zip 함수는 같은 인덱스에 있는 요소를 묶어서 튜플로 반환하는 iterator 이다. 


    zip(*arr)

    arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 라고 했을때

    *arr = [1, 2, 3], [4, 5, 6], [7, 8, 9]이 된다. 

    0번째 인덱스 애들끼리 합치면 [1, 4, 7] 

    1번째 인덱스 애들끼리 합치면 [2, 5, 8]

    2번째 인덱스 애들끼리 합치면 [3, 6, 9] 

    zip(*arr) = [1, 4, 7], [2, 5, 8], [3, 6, 9] 가 된다. 


    원래는 열에 있던 애들이 행으로 바뀌었다. 

    이건 arr[i][j] 이 arr[j][i]로 바뀐것과 같다. 



    map(list, zip(*arr)) 

    만약, map함수를 쓰지않고 그냥 list(zip(*arr))하면 튜플로 저장된 list가 되는 것이다. 

    이렇게 튜플로 저장이 되기때문에 map함수를 써서 하나의 행마다 list로 변환을 해줘야한다. 




    list(map(list, zip(*arr)))

    map 함수의 리턴값 또한 iterator로 map 객체가 반환된다. 

    그래서 list(map(~~))로 list 형변환을 해줘야한다. 



    def solution(arr):
        return int(arr == list(map(list, zip(*arr))))


    arr[i][j] = arr[j][i] 는 행과 열이 바뀌어도 값이 같은지를 체크하는 건데 

    이렇게 zip(*arr)로도 표현이 됨을 배웠다. 



    댓글

    이 블로그의 인기 게시물

    [KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계

    KT 에이블스쿨 : 클라우드 서비스 1일차 정리