Skip to content

Conversation

@zaqquum
Copy link
Collaborator

@zaqquum zaqquum commented Apr 26, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 목표한 양의 문제를 다 풀지 못하였다. 실버 1~ 골드는 여전히 풀고 정리하는데만 4시간 걸리는 것 같다. 풀면서 다른 사람들은 이걸 어떻게 1시간 내로 아이디어를 떠올리고 푸는지 신기할 따름이다.
  • 담주 부터는 꼭 매일 풀도록 하자

🚀주간 목표 문제 수: 5개

푼 문제


백준 #2470. 두 용액: 투포인터/ 골드5

정리한 링크: (바로가기)

🚩플로우 (선택)

  1. 오름차순 정렬
  2. 투 포인터 → right , left 의 합의 절대값이 작은 조합 찾기

🚩제출한 코드

import sys
N = int(sys.stdin.readline())
liqs = sorted(list(map(int, sys.stdin.readline().split())))

# print(liqs)
# 1. +- 의 조합
start = 0 ; end = len(liqs)-1
closed_z = [start,end,abs(liqs[start] + liqs[end])]
while start < end :
    c = liqs[start] + liqs[end]
    if closed_z[-1] > abs(c) : 
        closed_z = [start,end, abs(c)]
        if c == 0 : 
            break
        # print(f"##")
    # print(f"# {c} : {closed_z}   =  {liqs[start]} / {liqs[end]}")

    if abs(liqs[start]) > abs(liqs[end]) : 
        start+= 1
    # elif abs(liqs[start]) < abs(liqs[end]) : 
    else :
        end -=1


print(liqs[closed_z[0]] , liqs[closed_z[1]])

💡TIL

배운 점이 있다면 입력해주세요

##백준 #28069. 김밥천국의 계단: DP/ 골드5
정리한 링크: (바로가기)

🚩플로우 (선택)

(1) nex_i = 계단 +1
(2) nex_i = i + i//2

  1. dP 리스트 생성 및 초기화
  2. for 문
dp[i] : 현재 i 도달하는데 최소 횟수
dp[i+1] = min(dp[i+1] , dp[i]+1) # 유지 , 업데이트 
dp[i + i//2] = min(dp[i+i//2] , dp[i]+1) 
  1. 결과 출력

🚩제출한 코드

import sys
from collections import deque
#1. 입력 변수
N , K = map(int, sys.stdin.readline().split())
# DP
INF = 1e9
dp = [INF] * (N+1)

dp[0] = 0 
dp[1] = 1  # 1 = 0+1 1가지 밖에 없음

"""
dp[i] : 현재 i 도달하는데 최소 횟수
dp[i+1] = min(dp[i+1] , dp[i]+1) # 유지 , 업데이트 
dp[i + i//2] = min(dp[i+i//2] , dp[i]+1) 
"""

for i in range(1,N+1):
  if i+1 <= N : 
    dp[i+1] = min(dp[i+1] , dp[i]+1) 
  if i+i//2 <=  N : #순간이동 가능한 경우
    dp[i + i//2] = min(dp[i+i//2] , dp[i]+1)

if dp[N] <= K : 
  print("minigimbob")
else : 
  print("water")

백준 #2473. 세 용액: 투포인터/ 골드3

정리한 링크: (바로가기)

🚩플로우 (선택)

(1) x 는 고정 : for문으로 0~ N-2 반복

(2) y,z는 범위 x+1 ~ N 사이에서 탐색

(3) abs(x+y+z) 의 최소값 & 조합 업데이트

🚩제출한 코드

import sys

INF = 1e12
N = int(sys.stdin.readline())
arr = sorted(list(map(int, sys.stdin.readline().split())))
#1. 오름차순 정렬 과 포인트 초기화

total_min = INF
answer = []
# print(f"arr {arr}")
# 2. 투 포인터 
# x < y<z 일때 - X 는 fix , y,z는 투 포인터
for i in range(N-2):
    x = arr[i]
    yp = i+1
    zp =N-1
    while yp < zp : 
        xyz_sum =x + arr[yp] + arr[zp]
        #결과값 업데이트
        if abs(xyz_sum) < total_min :  # 업데이트
            answer = [x,arr[yp],arr[zp]]
            total_min = abs(xyz_sum) 
        # 포인터 이동 
        if xyz_sum <0 : 
            yp+=1
        elif xyz_sum >0 :
            zp-=1
        else : # xyz_sum == 0 
            print(" ".join(map(str,answer)))
            sys.exit()



str_answer = " ".join(map(str,answer))
print(str_answer)

Copy link
Collaborator

@Mingguriguri Mingguriguri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 문제 풀 때는 1시간 정해두고 못 풀면 풀이 보고 이해하고 정리하는 과정을 걸리더라구요.. 특히 DP는 시간 안에 아이디어 못 떠올릴 때가 많아서 진짜 경험 싸움인 것 같기도 합니다..ㅜㅜ
이번 주도 고생 많으셨습니다~ 다음 주도 화이팅!!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 두 용액을 더한 값을 따로 변수로 두었는데 이렇게 하나의 리스트에 한 번에 관리해도 좋겠군요!

Comment on lines +58 to +60
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

홍주님처럼 합이 0이면 바로 출력하고 종료하는 것도 효율적이겠네요!!

Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 발제 문제와 과제 문제 모두 잘 풀어주신것 같습니다.

# x < y<z 일때 - X 는 fix , y,z는 투 포인터

위와 같이 주석에도 잘 작성해 주셨듯, 과제 문제는 N이 5000개까지이므로 O(N log N)의 시간복잡도를 사용할 수 있는 문제였습니다. 따라서 선형으로 O(N) 시간복잡도를 써서 세 용액중 하나를 고정시켜놓고, 발제문제에서 사용한 투 포인터 알고리즘으로 O(log N) 시간 복잡도를 써서 나머지 용액 중 절댓값이 0에 가장 가까운 두 용액을 찾으면 되는 문제였습니다.

한 주 수고하셨습니다!!!

@zaqquum zaqquum merged commit 91a0bcf into main Apr 28, 2025
@github-actions
Copy link

🔥2025-04 챌린지 진행 상황

👉 그래프

  • YoonYn9915: 1개 ❌
  • Mingguriguri: 3개 ❌
  • zaqquum: 4개 ❌
  • learntosurf: 3개 ❌

👉 DP

  • YoonYn9915: 3개 ❌
  • Mingguriguri: 6개 ✅
  • zaqquum: 5개 ✅
  • learntosurf: 0개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants