Skip to content

Conversation

@YoonYn9915
Copy link
Member

@YoonYn9915 YoonYn9915 commented Apr 26, 2025

🌱WIL

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

  • 이번 주는 투 포인터 혹은 이분탐색과 관련된 문제를 발제했다. 이전에도 부분합, 블랙 프라이데이 등의 문제로 이 주제를 접했었는데, 그때마다 힌트없이는 못 풀었었다. 근데 코테에 자주 나오는 유형은 아니라고 해서 dp, 그래프, 구현, 그리디 등의 문제를 더 중요시 했었는데 이번 코테 풀 때 나와서 복습 차 이 주제를 선정했다.

  • 과제 문제를 어떻게 풀까... 하다가

  1. 발제 문제에서 풀었던 대로 합의 절댓값이 0에 가장 가까운 두 용액을 먼저 구한 후 나머지 용액 중 절댓값이 가장 작은 용액을 골라서 3개를 맞추자 라고 생각했는데 [-2 6 -97 -6 98]에서 [6, -6, -2]를 골라버리면서 (6과 -6의 합이 0이니까 이것을 우선 뽑고 나머지 중 가장 작은 -2를 뽑은 로직) 실패.
  2. 세 개의 포인터(left, mid, right)를 써서 left와 right 사이에 모든 값을 하나씩 mid로 지정하여 비교해가며 풀이했는데, 문제를 풀다 보니 이 방법은 O(N2)으로 시간 초과로 실패.
  3. 그러다보니 힌트를 써서 세 값을 구해야 할 때는 하나의 값을 고정(i)하고, 나머지 두 값을 투포인터로 찾아야 한다는 것을 알게 되었다. 쉬운 로직이었는데 풀때는 왜 생각이 안난건지 모르겠다.

🚀주간 목표 문제 수: 3개

푼 문제


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

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

🚩제출한 코드

import sys

N = int(sys.stdin.readline())
arr = sorted(map(int, sys.stdin.readline().split()))

left = 0
right = N - 1

answer = (arr[left], arr[right], abs(arr[left] + arr[right]))

# 투 포인터 사용해서 절대값이 0에 가장 가까운 두 값 찾기
while left < right:
    total = arr[left] + arr[right]
    abs_total = abs(total)

    if abs_total < answer[2]:
        answer = (arr[left], arr[right], abs_total)
        if abs_total == 0:
            break
    # 두 용액의 값이 0보다 크면 right를 줄여서 합을 작게 만든다
    if total > 0:
        right -= 1
    else:
        # 두 용액의 값이 0보다 작으면 left를 늘려서 합을 크게 만든다
        left += 1

print(f"{answer[0]} {answer[1]}")

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

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

🚩제출한 코드

import sys

inp = sys.stdin.readline

N = int(inp())
arr = list(map(int, inp().split()))
arr.sort()

min_value = int(1e10)
answer = [-1, -1, -1]

# 각 용액을 순회하며
for i in range(N):
    left = i + 1
    right = N - 1

    # i번 용액을 넣었을 때 값이 가장 0에 가까운 두 값 찾기
    while left < right:
        if left == i:
            left = i + 1
            continue
        elif right == i:
            right = i - 1
            continue

        total = arr[i] + arr[left] + arr[right]

        # 세 용액의 합이 0에 가장 가까우면 업데이트
        if abs(total) < min_value:
            min_value = abs(total)
            answer = [arr[i], arr[left], arr[right]]

        if total == 0:
            break
        elif total < 0:
            left += 1
        else:
            right -= 1

answer.sort()

for ans in answer:
    print(ans, end=" ")

💡TIL

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

  • python에서 정수형의 크기 제한에 대해 새롭게 알게 되었다.
    옛날 Python 2에서는 int와 long이 구분되었는데, Python 3부터는 둘이 통합되어 int 하나만 남았고, 크기 제한이 사라졌다.
    정리하면:
    Python 3의 int형은 메모리가 허용하는 한 무한대에 가깝게 커질 수 있다.

백준 #2240. 자두 나무: dp / 골드 5

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

🚩제출한 코드

from sys import stdin

T, W = map(int, stdin.readline().split())


lst = [0]
dp = [[0]*(W+1) for _ in range(T+1)]

# 입력 받기
for _ in range(T):
    lst.append(int(stdin.readline()))

# DP 테이블 채우기
for i in range(1, T+1):
    if lst[i] == 1:
        # 이동을 한 번도 안 했을 경우 (항상 1번 나무 아래 있음)
        dp[i][0] = dp[i-1][0] + 1  # 자두 먹으면 +1
    else:
        # 1번 나무 아래 있는데 2번 나무에서 자두 떨어지면 못 먹음
        dp[i][0] = dp[i-1][0]

    # 이동 횟수 1회 이상부터
    for j in range(1, W+1):
        if lst[i] == 2 and j % 2 == 1:
            # 홀수번 이동했을 때는 2번 나무 아래 있음 → 2번 나무에서 자두 떨어지면 +1
            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + 1
        elif lst[i] == 1 and j % 2 == 0:
            # 짝수번 이동했을 때는 1번 나무 아래 있음 → 1번 나무에서 자두 떨어지면 +1
            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + 1
        else:
            # 자두 못 먹을 경우, 이동하거나 이동 안 하거나 둘 중 최대값만 가져오기
            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j])

print(max(dp[-1]))

💡TIL

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

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.

  • 저도 발제 문제를 똑같은 방식으로 세 포인터(left, mid, right)를 써서 접근했었네요.. 하나의 값을 고정해야 한다는 것을 저도 이번에 새로 알게 되었고 앞으로도 써먹어볼 예정입니다!
  • 좋은 발제&과제 문제 가져와주셔서 감사합니다! 덕분에 새로운 방법을 알게 되었습니다

@YoonYn9915 YoonYn9915 merged commit b5b315b into main Apr 27, 2025
@github-actions
Copy link

🔥2025-04 챌린지 진행 상황

👉 그래프

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

👉 DP

  • YoonYn9915: 3개 ❌
  • Mingguriguri: 6개 ✅
  • zaqquum: 4개 ❌
  • 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.

3 participants