Skip to content

Conversation

@YoonYn9915
Copy link
Member

@YoonYn9915 YoonYn9915 commented May 17, 2025

🌱WIL

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

  • 이번 구현 문제들은 난이도가 낮아 쉽게 생각했는데 실버1이었음에도 시간이 꽤 오래 걸렸다. 문제를 빠르게 읽고 정확하게 이해하는 것이 중요하다고 생각했다. 발제 문제는 문제 설명에 플로우가 순서대로 다 나와있었기 때문에 코드만 잘 짜면 되었는데, 과제 문제는 그런 설명이 없다보니 더 애먹었다. 과제 문제의 경우 기준점(나같은 경우 (0,0))에서부터 시계방향으로 동근이의 거리, 상점의 거리 두 개를 구해서 그 차이를 구하면 되는 문제였다. 이 부분에 대해서는 인지하고 있었는데 거리계산 함수를 작성할 때 뭔가 오류가 있었던 모양이다. 계속 조금씩 틀려서 힌트를 봤다. 결국 아래와 같이 했는데 4번에서 +를 마이너스로 써서 틀린것 같았다.
    if dir == 1:
        return num
    elif dir == 2:
        return row + col + (row - num)
    elif dir == 3:
        return row + col + row + (col - num)
    elif dir == 4:
        return row + num

🚀주간 목표 문제 수: 3개

푼 문제


백준 #2110. 공유기 설치: 이분탐색 / 골드 4

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

🚩제출한 코드

import sys

inp = sys.stdin.readline


def install_router(mid):
    # 가장 왼쪽의 집은 무조건 설치
    router_count = 1
    previous_house = house[0]

    # 이전에 공유기를 설치했던 집 좌표 + mid <= 현재 집 좌표인지 확인
    for i in range(N):
        if previous_house + mid <= house[i]:
            router_count += 1
            previous_house = house[i]

    return router_count


# 입력받기
N, C = map(int, inp().split())
house = list(map(int, [inp() for _ in range(N)]))

# 정렬
house.sort()

# 인접한 두 집의 가능한 최소거리와 최대거리
start = 1
end = house[N - 1] - house[0]

# 정답
answer = 0

while start <= end:
    # 이분탐색을 위한 mid
    mid = (start + end) // 2

    # 설치한 공유기 개수를 반환
    router_count = install_router(mid)

    if router_count >= C:
        start = mid + 1
        answer = mid
    else:
        end = mid - 1

print(answer)

💡TIL

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

  • 풀이 중 발견한 문제점

  • 문제점 1: while (start < end) 조건
    왜 문제인가?
    start < end 조건을 사용하면 start가 end와 같아지는 순간 루프가 종료됩니다.
    그런데 이분 탐색의 핵심은 모든 가능한 거리(mid)에 대해 최적값을 찾는 것입니다.
    start == end == mid인 상태에서도 한 번 더 검사를 해야 모든 mid를 확인할 수 있습니다.
    이 조건으로는 마지막 가능한 거리(mid)를 체크하지 않고 루프가 끝나므로 정답을 놓칠 수 있습니다.

  • 올바른 방법: while (start <= end)
    이 조건을 쓰면 start == end일 때도 마지막으로 한 번 더 탐색하고 종료합니다.
    이는 이분 탐색의 표준 패턴이며, 모든 가능한 값에 대해 판단을 마친 뒤 루프를 종료시킵니다.

  • 문제점 2: start = mid 사용과 System.out.println(start - 1)
    왜 문제인가?
    공유기 설치가 가능한 경우 start = mid로 설정하면 mid를 다시 검사하는 상황이 반복될 수 있습니다.
    예를 들어, start = 4, end = 5일 때 mid = 4가 됩니다.

    • 설치 가능해서 start = mid 하면 여전히 start = 4, end = 5.
    • 다음 루프에서 또 mid = 4이고 무한 반복 가능성 발생 → 무한 루프 혹은 탐색 누락
  • 올바른 방법:
    공유기를 설치할 수 있는 경우는 더 넓은 거리를 확인해야 하므로 start = mid + 1로 가야 합니다.
    정답 후보는 따로 answer 변수에 저장해두고, 탐색 후 출력해야 합니다.

백준 #1283. 단축키 지정: 구현 / 실버 1

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

🚩제출한 코드

import sys

inp = sys.stdin.readline

N = int(inp())

# 단축키로 지정된 대문자 알파벳들
used_shortcuts = set()

# 결과 저장용 리스트
results = []

for _ in range(N):
    original = inp().strip()
    shortcut_index = -1
    words = original.split()
    index_in_string = 0

    # 1단계: 각 단어의 첫 글자 확인
    for word in words:
        char = word[0].upper()
        if char not in used_shortcuts:
            used_shortcuts.add(char)
            shortcut_index = index_in_string
            break
        index_in_string += len(word) + 1  # 공백 포함해서 다음 인덱스 계산

    # 2단계: 전체 문자열 순회
    if shortcut_index == -1:
        for i, char in enumerate(original):
            if char != ' ' and char.upper() not in used_shortcuts:
                used_shortcuts.add(char.upper())
                shortcut_index = i
                break

    # 단축키 표시
    if shortcut_index != -1:
        marked = (
            original[:shortcut_index]
            + '[' + original[shortcut_index] + ']'
            + original[shortcut_index + 1:]
        )
        results.append(marked)
    else:
        results.append(original)

# 출력
print('\n'.join(results))

💡TIL

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

  • 단축키 저장 자료구로 list대신 set이 더 유리한 이유 정리

  • 이유 1: in 연산의 성능 차이
    list는 in 연산시 O(n)소모, set은 in 연산시 O(1)소모
    N개의 문장을 처리할 때 단축키 등록 여부를 매번 검사해야 하므로, list보다 set이 훨씬 빠르다.

  • 이유 2: 의미적으로 중복이 없어야 하는 자료
    단축키는 중복되면 안 되기 때문에, 중복을 자동으로 방지하는 set이 더 알맞은 자료형이다.

백준 #2564. 경비원: 구현 / 실버 1

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

🚩제출한 코드

import sys

inp = sys.stdin.readline

row, col = map(int, inp().strip().split())

# 전체 둘레
round_length = row * 2 + col * 2
answer = 0

# 동근이의 위치와 상점의 좌표 저장
locations = []
n = int(inp().strip())

for _ in range(n + 1):
    dir, num = map(int, inp().strip().split())
    locations.append((dir, num))


def calculate_distance(dir, num):
    if dir == 1:
        return num
    elif dir == 2:
        return row + col + (row - num)
    elif dir == 3:
        return row + col + row + (col - num)
    else:
        return row + num


for i in range(n):
    # 동근이 좌표
    dir, num = locations[n]

    # 상점 좌표
    store_dir, store_num = locations[i]

    # (0,0)에서부터 시계방향으로 동근이의 거리
    d1 = calculate_distance(dir, num)

    # (0,0)에서부터 시계방향으로 상점의 거리
    d2 = calculate_distance(store_dir, store_num)

    # 시계방향 동근이 - 상점간 거리
    distance = abs(d2 - d1)

    if distance < round_length // 2:
        answer += distance
    else:
        answer += round_length - distance

print(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.

한 주간 고생 많으셨습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

boolean 변수가 아니라 인덱스를 저장하는 변수를 두어서 접근하여, 마지막에 인덱스가 -1이 아닌 경우에만 마크 표시를 하는 것이 인상적이었습니다!

Comment on lines +49 to +58
Copy link
Collaborator

Choose a reason for hiding this comment

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

그리고 입력받은 값을 바로바로 출력하는 것이 아니라 result에 저장해두고, 마지막에 하나씩 출력하는 것도 인상 깊었어요! 참고가 되었습니다 :D

Comment on lines +67 to +70
Copy link
Collaborator

Choose a reason for hiding this comment

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

저는 min()함수를 썼는데 이런 조건식으로 접근할 수도 있는 것, 알아갑니다!

@YoonYn9915 YoonYn9915 merged commit 7a12ae7 into main May 18, 2025
@github-actions
Copy link

🔥2025-05 챌린지 진행 상황

👉 그래프

  • YoonYn9915: 0개 ❌

👉 구현

  • YoonYn9915: 2개 ❌

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