진짜 나한테 너무너무너무 어려웠다. 거의 포기하고 넘어갈까 고민하다가 유튜브로 재귀함수도 찾아보고, 알고리즘에 이끌려 포인터가 어려운가요 재귀함수가 어려운가요 동영상까지 보게됐다.
역시 문과생에게 알고리즘은 벽인건가 싶다가 그냥 코드를 외워버리기로 했고 코드를 외우다보니 어떤 방식으로 알고리즘이 진행되는지 이해가 됐다. 그래서 고수들의 코드를 토대로 내 코드를 다시 작성했다.
def recur(num):
global Map
if num == 3 :
Map[0][:3] = Map[2][:3] = [1]*3
Map[1][:3] = [1,0,1]
return
a = num//3
recur(num//3)
for i in range(3):# 행
for j in range(3): #열
if i==1 and j==1:
continue
for k in range(a):
Map[i*a+k][a*j:a*(j+1)] = Map[k][:a]
n = int(input())
Map = [[0 for i in range(n)] for i in range(n)]
#Map = [[0]*n]*n
recur(n)
for i in Map :
for j in i :
if j :
print('*', end = '')
else :
print(' ', end = '')
print()#줄바꿈
솔직히 다른 고수꺼랑 코드는 동일하다. 그러나 재밌는점을 발견했다.
cmd상에서는 Map1과 Map2가 동일하게 출력된다.
Map1 = [[0 for i in range(n)] for i in range(n)]
Map2 = [[0]*n]*n
그러나! 실제로 이 배열을 핸들링하게되면 서로 다른 값이 나온다.
이 부분때문에 왜 이렇게 되는건지 궁금해서 오픈카톡에 고수분들께 여쭤보았고 결과적으로 Map2를 선언한것과 같이 [[0]*n]*n으로 선언하게 되면 주소값을 가져오게 되기때문에 하나만 변경해도 일괄적으로 변경이 되는것이다.
그러나 Map1을 선언한것과 같이 [[0 for i in range(n)] for i in range(n)]를 사용하게되면 값을 입력하기 때문에 개별적으로 변경이 되는 것이었다.
앞으로는 for를 사용해서 2차원 배열을 선언해야겠다.
참고자료:Python | Using 2D arrays/lists the right way - GeeksforGeeks
'알고리즘' 카테고리의 다른 글
백준 2751 풀이 (힙정렬) (0) | 2021.02.12 |
---|---|
백준 11729 풀이 (하노이탑) (0) | 2021.02.11 |
백준 10870 풀이 (재귀함수, 피보나치) (0) | 2021.02.10 |
백준 10872 풀이 (재귀함수, 팩토리얼) (0) | 2021.02.10 |
#3 알고리즘 공부 2/8 리뷰 (0) | 2021.02.08 |