프로그래머스 파이썬 기초 트레이닝 :: 특별한 이차원 배열 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
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 객체 자체를 반환하기 때문에 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]이 된다.
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로 변환을 해줘야한다.
list(map(list, zip(*arr)))
그래서 list(map(~~))로 list 형변환을 해줘야한다.
def solution(arr):
return int(arr == list(map(list, zip(*arr))))
arr[i][j] = arr[j][i] 는 행과 열이 바뀌어도 값이 같은지를 체크하는 건데
이렇게 zip(*arr)로도 표현이 됨을 배웠다.
댓글
댓글 쓰기