오늘도 알찬 하루를 보냈다....
치과 등 개인사정으로 오늘은 집에 가서 재택으로 함께하는 팀원들이 있어서,
Slack으로 다음과 같이 오늘의 업무 현황을 공유했다.
Slack에서 보낸 글에서 보낸 gif는 다음과 같다 ! 기존에는 '정글러버'의 프로필 페이지만 있어서 누구를 누르든 다 정글러버 프로필로 연동되고 있었다. 이를 각 유저별로 프로필 페이지를 접속할 수 있도록 수정했다. 다만 클릭했을 때, 그 target의 id를 확인해서 그에 알맞은 프로필 페이지를 접속하도록 로직을 개선했더니, 마이페이지는 오류가 나는 상태이다. 이건 그 직후에 처리해주었다. (아래쪽 캡쳐본에서 '고니고니' 페이지 확인가능)
ListView 안에 ListView를 넣었더니 오류가 나서, 2번째 ListView를 다른 것으로 살짝 감싸줬더니 해결되었다 :) Flutter 전문가가 되어가는 중... 수평 스크롤, 수직 스크롤이 모두 가능하도록 만들었다.
그 이후에는, 명함첩의 UI를 바꿔서, 진짜 명함처럼 좀 큰 사이즈로 들어가게 바꿔주었다. 그리고 각 프로필 페이지에서 DM 버튼을 누르면, 그 사람과의 대화창을 열어볼 수 있도록 수정해주었다. 마지막으로 아까는 에러가 났던 마이페이지를 잘 뜨도록 해주었다.
오늘 알고리즘 스터디에서는 정수삼각형이라는 문제를 풀었다.
28분 정도 걸렸는데, 다소 아쉬웠다. 이전에 푼 기억이 어렴풋이 나는 문제였기 때문이다. . .
정수삼각형 문제는 다음과 같이 생겼다.
처음에는 그냥 모든 경우의 수를 가지고 구하는 코드를 짰는데, 막상 해보니 효율성에서 시간초과가 났다.
이것저것 시도해봐도 계속 시간초과가 나서 왜지...? 하고 곰곰이 생각해보니까, 만약 3번째 줄에 '1'로 간다고 했을 때, 합이 가장 크게 되는 경로는 7-8-1일 것이다. 따라서 7-3-1은 고려할 필요가 없다. 이 생각이 드니까, DP구나! 싶었다. 그리고 그 순간에 왼쪽 상단에 '동적 계획법(Dynamic Programming)'이라고 적힌 문제 분류가 보였다. 일부러 문제 분류를 안 보고 풀긴 했는데... 하하하
DP임을 인지하고 나니까, 5분만에 쉽게 풀렸다.
# DP[1][0] = DP[0][0] + triangle[1][0]
# DP[1][1] = DP[0][0] + triangle[1][1]
# DP[2][0] = DP[1][0] + triangle[2][0]
# DP[2][2] = DP[1][1] + tirangle[2][2]
# DP[3][0] = DP[2][0] + triangle[3][0]
# DP[3][1] = DP[2][0]
# DP[3][1] = DP[2][1]
# DP[3][3] = DP[2][2] + triangle[3][3]
점화식은 위와 같이 케이스를 나누어가며 생각해보니 쉽게 짤 수 있었다.
이렇게 해서 최종적으로 구성한 코드는 다음과 같다.
# 프로그래머스 # 정수삼각형 # 28min sol
def solution(triangle):
n = len(triangle)
DP = [[0]*i for i in range(1,n+1)]
DP[0][0] = triangle[0][0]
for i in range(1,n):
# 첫 번째 지점과 마지막 지점은 갈 수 있는 루트가 하나밖에 없다.
DP[i][0] = DP[i-1][0] + triangle[i][0]
DP[i][i] = DP[i-1][i-1] + triangle[i][i]
# 나머지 지점들은 2가지 루트가 있으니, 둘 중 합이 더 커지는 루트를 선택한다.
for j in range(1,i):
DP[i][j] = max(DP[i-1][j-1], DP[i-1][j]) + triangle[i][j]
# 가장 아래 줄에서, 최종적으로 합이 제일 커지는 경우가 얼마인지를 체크해서 반환한다
return max(DP[-1])
이렇게 제출한 코드는, 효율성도 문제없이 통과했다 !