Skip to content

Conversation

@Mingguriguri
Copy link
Collaborator

@Mingguriguri Mingguriguri commented Oct 26, 2025

푼 문제가 여러 개라면 아래 폼 형식 복사해서 넣어주시면 됩니다 :D

🌱WIL

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

  • 이번 주는 투 포인터가 핵심인 문제 2개를 풀었다. 투 포인터는 보통 2개의 값을 가지고 비교하는 로직이지만, 이번 문제들은 3가지 이상의 값을 구해야 해서 풀이하는 방식이 기억에 남는다. 특히 과제 문제인 합이 0 문제는 단순히 값을 세는 게 아니라 '조합의 수'를 수학적으로 계산해야 했다.

🚀주간 목표 문제 수: 2개

푼 문제


백준 #10025. 게으른 백곰: 투포인터 / 실버3

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

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys
input = sys.stdin.readline

# N: 얼음 양동이 수, K: 떨어진 거리
N, K = map(int, input().split())
buckets = []
max_x = 0
for _ in range(N):
    # g: 얼음 양, x: 양동이 좌표
    g, x = map(int, input().split())
    buckets.append((g, x))
    max_x = max(max_x, x)

arr = [0] * (max_x+1)
for g, x in buckets:
    arr[x] += g

window_size = 2 * K + 1
current = sum(arr[:window_size])
answer = current
for i in range(window_size, max_x + 1):
    current += arr[i] - arr[i - window_size]
    answer = max(answer, current)

print(answer)

💡TIL

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


백준 #3151. 합이 0: 투포인터 / 골드4

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

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys
input = sys.stdin.readline

N = int(input())
coding = list(map(int, input().split()))
coding.sort()
answer = 0

for i in range(N):
    target = -coding[i]
    left = i + 1
    right = N - 1

    while left < right:
        two_sum = coding[left] + coding[right]
        if two_sum < target:
            left += 1
        elif two_sum > target:
            right -= 1
        else: # two_sum == target
            if coding[left] != coding[right]:
                left_value = coding[left]
                right_value = coding[right]

                # 왼쪽에 같은 값(left_value)이 연속으로 몇 명 있는지 센다
                cnt_left = 1
                while left + cnt_left < right and coding[left + cnt_left] == left_value:
                    cnt_left += 1

                # 오른쪽에 같은 값(right_value)이 연속으로 몇 명 있는지 센다
                cnt_right = 1
                while right - cnt_right > left and coding[right - cnt_right] == right_value:
                    cnt_right += 1

                # 이 조합들 각각은 전부 서로 다른 학생 조합이므로
                # 경우의 수 = cnt_left * cnt_right
                answer += cnt_left * cnt_right

                # 세야 할 학생을 처리했으므로, 포인터 한 번에 이동
                left += cnt_left
                right -= cnt_right

            else: # coding[left] == coding[right]
                # 이 구간에 남은 학생 수
                m = right - left + 1

                # m명 중 2명을 뽑는 조합 수 C(m, 2)
                answer += m * (m - 1) // 2

                # i에 대해 셀 조합 종료
                break

print(answer)

💡TIL

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

@Mingguriguri Mingguriguri self-assigned this Oct 26, 2025
@Mingguriguri Mingguriguri merged commit 300823b into main Oct 27, 2025
@github-actions
Copy link

🔥2025-10 챌린지 진행 상황

👉 그래프

  • Mingguriguri: 2개 ❌

👉 구현

  • Mingguriguri: 0개 ❌

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants