본문 바로가기
코딩테스트/프로그래머스

프로그래머스 > 코딩테스트 연습코딩 기초 트레이닝 > 특별한 이차원 배열 1

by 나는야석사 2024. 7. 9.

문제 설명

정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.

  • arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.

제한사항
  • 1 ≤ n ≤ 100

입출력 예nresult
3 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
6 [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]
1 [[1]]

입출력 예 설명

입출력 예 #1

  • 예제 1번의 n의 값은 3으로 다음과 같이 2차원 배열을 채울 수 있습니다.i \ j012
    0 1 0 0
    1 0 1 0
    2 0 0 1
    따라서 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]을 return 합니다.

입출력 예 #2

  • 예제 2번의 n의 값은 6으로 다음과 같이 2차원 배열을 채울 수 있습니다.i \ j012345
    0 1 0 0 0 0 0
    1 0 1 0 0 0 0
    2 0 0 1 0 0 0
    3 0 0 0 1 0 0
    4 0 0 0 0 1 0
    5 0 0 0 0 0 1
    따라서 [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]을 return 합니다.

입출력 예 #3

  • 예제 1번의 n의 값은 1이고 다음과 같이 2차원 배열을 채울 수 있습니다.i \ j0
    0 1
    따라서 [[1]]을 return 합니다.
def solution(n):
    answer = [[0]*n]*n
    for i in range(n):
        for j in range(n):
            if i == j:
                answer[i][j]=1
    return answer

안되는 코드

배열 생성 방식 자체가, 이렇게 생성한 리스트는 한 번에 생성한 것이기 때문에 하나의 원소가 바뀌면 모든 행에 있는 같은 인덱스를 가진 원소가 다 바뀐다는 단점이 있음. 

answer = [[0, 0, 0],
          [0, 0, 0],
          [0, 0, 0]]
          
answer[0][1] = 1
print(answer)

위는 그 예시로, 출력되는 것은 아래와 같음

[[0, 1, 0],
 [0, 1, 0],
 [0, 1, 0]]

따라서 각 행이 독립적인 리스트 객체를 참조하도록 바꿔야 한다는데 무슨 말인진 잘 모르겠지만, 리스트를 만들 때에는 각 하나의 원소로 구분하여 생성하는 것이 좋음.

또한 i와 j가 같은 순간에 answer[i][j]가 1로 바뀌고, [0][0],  [0][1], [0][2]가 다 1로 바뀜.

 

▶파이썬 리스트 참조할 것

n = 3
answer = [[0]*n]

answer = [ [0, 0, 0] ] 이다.

n = 3
answer = [[0]*n]*n

answer = [ [0, 0, 0], [0, 0, 0], [0, 0, 0] ] 이다.

 

def solution(n):
    answer = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if i == j:
                answer[i][j] = 1
    return answer

맞는 코드

i=0일때, j=0, j=1, j=2 돌아가면서 둘이 같을 때만 answer[i][j]를 1로 바꿈