파이썬 알고리즘 138번 | [백준 1932번] 정수삼각형

Yunny.Log ·2022년 3월 3일
0

Algorithm

목록 보기
141/318
post-thumbnail

138. 정수삼각형

1) 어떤 전략(알고리즘)으로 해결?

2) 코딩 설명

<내 풀이>


import sys
n=int(input()) # 수 입력받음 
arr=[[0]*n for _ in range(n)]
for i in range(n):
    arr[i] = list((map(int,sys.stdin.readline().split())))

res=[[0]*n for _ in range(n)] 
# 경우의 수 고려한 누적 합 담아놓을 저장소
res[0]=[arr[0][0]]#스타트는 그대로 복사해서 시작

for i in range(1,n): # 행 따지기
    # 1행  2행  3행  4행  .. 0행은 건너뛰어 하나니깐
    for j in range(i+1): # 열 따지기
        # 1행은 0 1 (두열), 2행은 0 1 2 (세열)
        if j==0 :
            res[i][j]+=res[i-1][0]+arr[i][0] #전자는 이전 누적값 더하는 것-후자는 현재 값
        elif j==i :
            res[i][j]+=res[i-1][j-1]+arr[i][j]
        else : 
            res[i][j]+=max(res[i-1][j],res[i-1][j-1])+arr[i][j]
print(max(res[n-1]))

<내 틀렸던 풀이, 문제점>


import sys
n=int(input()) # 수 입력받음 
arr=[[0]*n for _ in range(n)]
for i in range(n):
    arr[i] = list((map(int,sys.stdin.readline().split())))

res=[[0]*n for _ in range(n)] 
# 경우의 수 고려한 누적 합 담아놓을 저장소
res[0]=arr[0][0] #스타트는 그대로 복사해서 시작

for i in range(1,n): # 행 따지기
    # 1행  2행  3행  4행  .. 0행은 건너뛰어 하나니깐
    for j in range(i+1): # 열 따지기
        # 1행은 0 1 (두열), 2행은 0 1 2 (세열)
        if j==0 :
            res[i][j]=res[i-1][0]+arr[i][0] #전자는 이전 누적값 더하는 것-후자는 현재 값
        elif j==i :
            res[i][j]+=res[i-1][j-1]+arr[i][j]
        else : 
            res[i][j]+=max(res[i-1][j],res[i-1][j-1])+arr[i][j]
for i in res:
    print(i)

<반성 점>


TypeError: 'int' object is not subscriptable

  • 위 에러가 처음에 발생
res[i][j]+=res[i-1][0]+arr[i][0] #전자는 이전 누적값 더하는 것-후자는 현재 값
  • 이 코드에서 계속 발생했었다.
    나는 res가 이차원 배열인데 왜 저래 ㅡㅡ 하면서 화만 냈었는데
    마음을 추스르고 다시 보니
    어..?
    res[0]=arr[0][0]
    으로 처음에 선언했던 것이었다!! (위에 틀린 풀이 코드 참조)

저렇게 선언하면 res[0]=7 이라는 정수 형태가 되는데
나는 거기서 계속 res[0][0]을 호출하고 있었기 때문에 파이썬이
어어..? 7 정수는 인덱스가 없는애야 ㅠㅠ 라고 외쳐주고 있던 것
정신 똑띠 차리장

<배운 점>

  • 이차원 배열 선언
arr=[[0]*n for _ in range(n)]
  • sys로 2차원 배열에 readline으로 2차원 배열 채우기 위해 읽어들이기
import sys
arr=[[0]*n for _ in range(n)]
for i i range(n) :
	arr[i]=list(map(int,sys.stdin.readline().split())

0개의 댓글