LeetCode - 10 Essential DP Patterns

These days, I’m working hard to solve algorithm problems with Python. There are lots of platforms we can choose, such as Baekjoon or Programmers. These two websites are popular online algorithm websites in korea. Well there are many alternatives other than these two, such as Topcoder, Codeforces and Atcoder. These are very competitive algorithm contest websites. However if you want to improve your algorithm programming skills, LeetCode would be a great choice. About LeetCode LeetCode provides variety of problems and each of them is classified as Easy/Medium/Hard diffifulty. I recommend to solve the problems listed in Study Plan because they categorize problems into algorithm types very well. In my case, I started with Dynamic Programming study plan, and kept solving problems. ...

2023-7-22 · 2 min · 331 words · Junha

조금 더 알고 싶은 무인양품 수납법

無印良品, 직역하면 도장이 없는 양질의 물건들. 미니멀하고 깔끔한 디자인을 추구하는 무인양품의 제품들을 선호하는 편이다. 전과는 다르게 취향이 많이 변해서 알록달록한 색상보다는 깔끔하고 단정한 것들이 더 마음에 든다. 티셔츠도 프린팅이 너무 큰 건 싫고, 필기구도 바코드가 찍혀나오면 왠지 기분이 좋지 못하다. 그런 점에서 군더더기 없이 깔끔한 무인양품의 제품들은 우리의 눈길을 끈다. 이 책은 무인양품의 제품들을 사랑하고 실제로 아르바이트로 일해 본 경험이 있는 슈퍼 이용자가 무인양품 제품들로 집안을 정리하는 방법에 대해 말해준다. 이케아나 여러 인테리어 회사들에서도 수납 방법들에 대해 알려주지만, 왠지 무인양품이기에 뭔가 다른게 있지 않을까 싶어서 참고하게 되었다. ...

2023-7-21 · 2 min · 287 words · Junha

기억 전달자 THE GIVER

부모들은 자식에게 좋은 것만 보여주고 나쁜 것은 피하게 하고 싶어한다. 하지만 우리는 모두 인간이기에 항상 이상적인 환경에서 살아가는건 불가능하다. 하지만 만약 그런 무균실과도 같은 곳에서 살아갈 수 있다면 어떤 삶을 살게 될까? 이상적이고 부족함이 없는 그런 세계에서는 과연 모든 사람이 행복할까? 전쟁과 싸움, 분쟁 없이 매일매일 평화롭게 유지되는 사회. 그곳은 바로 이 책의 주인공들이 살아가는 세계이다. 사람마다 가지고 있는 시각과 견해가 모두 다르기에 우리는 그런 차이 때문에 서로 다투게 된다. 만약 감각과 기억을 조금 통제함으로써 모두가 행복하게 살 수 있도록 평화로운 세계를 만들면 어떨까? ‘기억 전달자’의 배경이 되는 세계는 마치 유토피아처럼 전쟁과 분쟁 같은 모든 부정적인 기억들은 제거되고 사람들은 그러한 정보게 접근할 수 없다. 오직 ‘기억 전달자(the giver)’만이 유일하게 그러한 정보들을 간직하고 다음 후임자에게 넘겨줄 수 있다. ...

2023-7-20 · 2 min · 351 words · Junha

백준 1021번 - 회전하는 큐

백준 1021번 문제 바로가기 deque을 이용한 풀이 deque(덱)을 이용해서 문제를 해결했다. deque는 일명 양방향 queue인데 queue.pop(0)으로도 맨 앞의 요소를 꺼낼 수 있지만 그보다는 deque.popleft()을 사용하는 편이 시간 소요가 적다.(더 직관적이기도 하고) 어떤 방향(오른쪽/왼쪽)으로 회전하는 것이 더 유리한지 판단하는 것만 잘 고려해주면 비교적 쉽게 해결 가능했다. # 입력 import sys from collections import deque n, m = map(int, sys.stdin.readline().split()) arr = map(int, sys.stdin.readline().split()) count = 0 queue = deque([i+1 for i in range(n)]) # 처리 for i in arr: if queue[0] == i: queue.popleft() else: from_left = queue.index(i) from_right = len(queue) - queue.index(i) - 1 if from_left <= from_right: for _ in range(from_left): queue.append(queue.popleft()) count += from_left queue.popleft() else: for _ in range(from_right): queue.appendleft(queue.pop()) count += from_right + 1 queue.pop() print(count)

2023-7-20 · 1 min · 120 words · Junha

백준 14501번 - 퇴사

백준 14501번 문제 바로가기 Bottom-Up 방식 문제는 이해했는데 ‘이걸 어떻게 구현하지’라는 생각에 문제를 해결하기까지 꼬박 이틀이 걸렸다. 예제들을 직접 손으로 그려보기도 하고, 문제를 다시 분석해보면서 해결책을 찾았다. Bottom-Up 방식이 그나마 직관적이고 이해하기 편해서 다음과 같이 구현했다. 0에서 n까지 index에 대해서 이중 max()로 값을 비교하고 최대 기댓값을 산출하는 알고리즘을 구현했다. # 입력 import sys n = int(sys.stdin.readline()) work = list(tuple(map(int, sys.stdin.readline().split())) for i in range(n)) dp = [0] * (n+1) # 처리 # bottom-up 방식 for i in range(n): if i+work[i][0] <= n: dp[i+work[i][0]] = max(dp[i+work[i][0]], max(dp[:i+1]) + work[i][1]) print(max(dp)) Top-Down 방식 아무리 고민해도 Top-Down 방식 구현이 어려워서 다른 블로그들을 참고했다. 예시 꾸준히 공부해나가면서 다른 접근으로도 풀어낼 수 있도록 실력을 키워야겠다. ...

2023-7-19 · 1 min · 110 words · Junha