코딩테스트 연습 - 입국심사 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

# 학습 키워드

이진탐색

최적화 문제 접근

시간 복잡도 최적화

 

 

 

# 문제 접근 방법

이 문제는 각기 다른 심사 시간이 주어졌을 떄, 주어진 인원을 가장 짧은 시간 안에 모두 심사하는 시간을 구하는 문제이다. 각 심사관은 고유한 심사 속도를 가지므로 특정 시간 내에 심사가 가능한 인원의 수를 계산하고, 최단 시간을 찾아내야 한다.

 

1. 이진 탐색을 통한 범위 축소

- 이 문제를 일반적인 반복문을 통해 해결하는 것은 비효율적이므로, 특정 시간 내에 필요 조건을 만족하는지를 기준으로 범위를 축소해가는 이진 탐색기법을 사용했다.

- 최솟값(left)은 가장 빠른 심사 시간을 의미하고, 최댓값(right)은 모든 인원이 가장 느린 심사관에게 심사를 받을 경우의 최장 시간을 의미한다.

 

2. 심사 가능한 인원 수 계산

- 특정 시간(mid) 내에 각 심사관이 처리할 수 있는 인원의 수를 계산하고, 이를 모든 심사관에 대해 합산하여 해당 시간 내에 처리 가능한 총 인원수(checked)를 구한다.

- 이때 checked가 목표 인원 n보다 크거나 같다면 더 짧은 시간에서도 가능할 수 있으므로 right값을 줄이고, 반대의 경우 left값을 늘리며 탐색 범위를 축소한다.

 

 

 

 

# 코드 작성

def solution(n, times):
    answer = 0
    left = min(times)
    right = max(times)*n
    while left <= right:
        mid = (left + right) // 2
        checked = 0
        for time in times:
            checked += mid // time
            if checked >= n:
                break
        if checked >= n:
            answer = mid
            right = mid - 1
        elif checked < n:
            left = mid +1
    return answer

 

 

 

 

# 회고

이진 탐색을 활용한 최적화 문제를 풀어본 경험이 있어 기본적인 접근 방식에는 큰 어려움이 없었다. 

하지만 이번 문제를 통해 탐색 범위 설정의 유연함이 필요하다는 것을 다시 느꼈다.

가장 짧은 심사 시간부터 시작하는 것이 반드시 최선이 아니고, 최댓값을 정할 때도 문제 상황에 따라 유연하게 설정할 수 있다는 점에서 새로운 인사이트를 얻었다.

 

목표 인원 이상이 될 경우 반복을 종료하는 조건을 넣어 반복문 효율성을 높이는 방법을 복습할 수 있었다. 이와같은 최적화 조건을 문제에 따라 다르게 적용할 수 있다는 점에서 이진 탐색 문제의 다양한 응용을 다시금 채감했다.

 

https://www.acmicpc.net/problem/11561

 

 

 

# 학습 키워드

1. 이분탐색 

이분탐색은 특정 조건을 만족하는 값을 찾는 데에 유용한 알고리즘이다. 이 문제에서는 mid 값을 활용하여 징검다리를 건널 수 있는 최대 칸을 계산한다.

 

2. 수열의 합

문제에서는 1부터 k까지의 합인 (k*(k+1))//2의 공식을 사용하여, k개의 징검다리를 건널 수 있는 최대 k를 찾는 데 활용한다

 

3. 시간 복잡도

이분 탐색을 활용하여 탐색 범위를 반으로 줄여 빠르게 답을 구할 수 있다. 일반적인 완전탐색보다 효율적이다.

 

 

 

# 문제 접근 방법

1. 문제 분석

1+2+3+ ... + k <= n 을 만족하는 최대의 k를 구하는 문제를 해결해야 한다.

첫 k개 자연수의 합이 n을 초과하지 않도록 최대한 큰 k를 찾아내는 것이 목표이다.

 

2. 이분 탐색 활용

이분 탐색을 사용하여 가능한 k의 범위를 좁혀간다.

 

- 초기 시작 값은 1, 종료값은 n으로 설정한다.

- mid값을 구하고, 1+2+...+mid = (mid*(mid+1))//2 공식에 따라 중간 지점까지의 합을 계산한다.

- 계산 결과가 n보다 작거나 같다면, mid가 가능한 값이라는 뜻이므로 start를 증가시키고 result를 갱신한다.

- 그렇지 않다면, mid를 mid-1로 줄여준다.

- 이 과정을 반복하여 최종적으로 result에 최대 k값을 구할 수 있다.

 

 

 

 

# 코드 작성 

t = int(input())

for _ in range(t):
    n = int(input())
    start = 1
    end = n
    result = 0

    while start <= end:
        mid = (start + end) // 2
        if ((mid+1)*mid)//2 <= n:
            start = mid + 1
            result = mid
        else:
            end = mid - 1
    print(result)

 

 

 

 

 

 

 

# 회고

이분 탐색은 단순 정렬된 배열에서의 탐색 뿐 아니라, 범위를 설정하고 특정 조건을 만족하는 값의 최솟값이나 최댓값을 찾는 데에도 매우 유용하다는 것을 확인했다. 이러한 문제를 통해 이분 탐색의 활용 능력을 키울 수 있다.

 

 

 

최근 <그림과 실습으로 배우는 깃 & 깃허브 입문>을 구입하게 되었는데요, 처음 깃과 깃허브를 공부하려는 입장에서 더없이 좋은 입문서라는 느낌이 들었습니다.

깃과 깃허브는 이제 개발자들뿐 아니라, 다양한 직군에서 협업을 위해 사용하는 필수 도구로 자리 잡았지만, 처음 시작할 때는 그 개념이 다소 생소하고 어렵게 느껴질 수 있습니다.

이 책은 이러한 초심자들의 눈높이에 맞춰 기초부터 차근차근 설명해 주기 때문에, 깃과 깃허브에 대한 기초 개념을 제대로 잡고 싶으신 분들에게 추천드리고 싶습니다. 😊

 

 

🔍 책의 주요 구성 및 장점

  1. 쉬운 설명과 체계적인 기초 다지기
    깃과 깃허브는 처음 접하면 어려운 기술 용어와 개념들이 많아 접근하기가 쉽지 않은데요, 이 책은 초심자가 이해하기 쉬운 언어로 개념을 풀어서 설명해 줍니다. 깃의 기본 명령어 사용법부터 시작해서, 브랜치 관리나 병합, 깃허브를 이용한 협업 기능까지 단계별로 차근차근 설명하고 있어, 혼자서도 공부를 이어나가기 좋습니다.
  2. 실제 실습을 통해 학습 내용 체득하기
    책의 큰 장점 중 하나는 학습한 이론을 곧바로 실습 예제로 이어갈 수 있다는 점입니다. 실제로 깃과 깃허브를 사용할 때 필요한 명령어와 상황들이 구체적인 예시로 설명되어 있어, 학습자들이 직접 실습하면서 내용을 체득할 수 있게 돕습니다. 따라 하다 보면 자연스럽게 명령어와 개념들이 익숙해지고, 실전에서도 유용하게 사용할 수 있을 것 같습니다.
  3. 일러스트와 함께 하는 이해하기 쉬운 설명
    복잡하게 느껴질 수 있는 깃과 깃허브의 흐름을 일러스트와 다이어그램을 통해 시각적으로 풀어내어, 설명이 훨씬 쉽게 와닿았습니다. 특히, 브랜치 관리와 커밋 히스토리 부분은 일러스트 덕분에 머릿속에 잘 정리되었고, 이후 학습을 이어갈 때도 큰 도움이 되었습니다.
  4. 협업을 위한 깃허브 사용법 익히기
    요즘 깃허브는 프로젝트 관리와 협업을 위해 필수적인 도구로 활용되는데, 이 책에서는 깃허브를 어떻게 협업에 활용할 수 있는지 구체적인 예시와 함께 설명해 주고 있습니다. 깃허브 리포지토리 관리, 풀 리퀘스트, 코드 리뷰 등의 기능을 단계적으로 배울 수 있어서, 협업이 필요한 실무 환경에서도 유용하게 활용할 수 있을 것 같습니다.

 

 

 

이해하기 쉬운 일러스트를 통해 깃과 깃허브의 기초 개념을 쳬계적으로 학습할 수 있어요

 

 

다양한 실습 예제를 통해 독자들이 직접 경험을 쌓을 수 있도록 합니다.

 

 

 

 

 

📌 추천 대상

<그림과 실습으로 배우는 깃 & 깃허브 입문>은 깃과 깃허브를 처음 접하는 분들이나, 기초부터 체계적으로 다시 배우고 싶은 분들에게 추천드립니다. 이론에 그치지 않고 실습을 통해 내용을 흡수할 수 있기 때문에, 막연히 깃과 깃허브가 필요하다고 느끼고 있으나 어디서부터 시작해야 할지 모르겠는 분들에게 좋은 길잡이가 될 것입니다. 깃과 깃허브에 대한 막연한 두려움을 없애고, 기본기를 다지고자 하시는 분들께 강력히 추천드려요!

 

 

 

 

책을 구입할 수 있는 링크도 아래에 첨부하니 관심 있으신 분들은 참고해 보세요. 😊

 

https://www.yes24.com/Product/Goods/133290567

 

그림과 실습으로 배우는 깃 & 깃허브 입문 - 예스24

Git, GitHub 입문. 이 책 한 권으로 끝낼 수 있습니다!Git을 처음 마주하면 대부분 당황한다. 저자 또한 비슷한 경험이 있고, Git을 학습하는 과정에서 원리를 알고 접근하면 굉장히 쉽고 간단하게 Git

www.yes24.com

https://product.kyobobook.co.kr/detail/S000214299095

 

그림과 실습으로 배우는 깃 & 깃허브 입문 | 한재원 - 교보문고

그림과 실습으로 배우는 깃 & 깃허브 입문 | Git, GitHub 입문. 이 책 한 권으로 끝낼 수 있습니다!Git을 처음 마주하면 대부분 당황한다. 저자 또한 비슷한 경험이 있고, Git을 학습하는 과정에서 원리

product.kyobobook.co.kr

 

https://www.acmicpc.net/problem/1072

 

 

 

 

# 학습 키워드

1. 이분탐색

특정 조건을 만족하는 값을 찾기 위해 탐색 범위를 반으로 줄여가는 방법을 사용했다. 이 문제에서는 승률이 변하는 최소 게임 수를 찾기 위해 이분탐색을 활용했다.

 

2. 수학적 연산과 반올림 문제

승률 계산 시 (100*y)//x와 같은 정수형 연산을 통해 승률을 구하고, 정수로 표현해 소수점 문제를 방지했다.

 

3. 예외처리

특정 조건을 만족할 수 없는 경우(승률이 99% 이상인 경우)에 대한 예외 처리가 필요했다.

 

 

 

 

# 문제 접근 방법

 

1. 문제 분석

주어진 x(총 게임 수)와 y(이긴 게임 수)에서 승률 z를 구하고, 승률 z가 증가할 때 필요한 최소 게임 수를 구하는 문제이다.

- 승률 z가 99% 이상이면 게임 수를 늘려도 승률이 거의 변하지 않으므로, 이때는 -1을 출력한다.

 

 

2. 이분 탐색을 활용한 최소 게임 수 찾기

새로운 게임을 추가했을 때, 승률이 증가할 수 있는 최소의 게임 수를 찾기 위해 이분 탐색을 사용했다.

- left는 1, rigth는 x로 설정하고, 중간 값 mid를 이용하여 조건을 만족하는지 확인한다

- (y + mid) * 100 // (x + mid)를 통해 승률을 구하고, 기존 승률 z보다 크다면 mid값을 저장하고 rigth를 mid -1로 줄여 탐색 범위를 좁혀간다.

- 반대로 승률이 증가하지 않는 경우, left를 mid + 1로 증가시켜서 계속해서 탐색한다.

 

 

 

# 코드 작성

x,y = map(int,input().split())
z = (100*y)//x
if z >= 99:
    print(-1)
else:
    answer = 0
    left = 1
    right = x

    while left <= right:
        mid = (left+right)//2
        if (y + mid) * 100 // (x + mid) <= z:
            left = mid + 1
        else:
            answer = mid
            right = mid - 1
    print(answer)

 

 

 

# 회고

문제에서 승률 z가 99% 이상일 경우, 어떤 경우에도 승률을 올릴 수 없는 상태가 된다. 이와 같은 예외를 초기에 처리해줘야 불필요한 연산을 피할 수 있다. 문제풀이에서 초기 조건을 꼼꼼하게 확인하고 예외를 처리하는 것이 효율적임을 다시 느꼈다.

 

 

 

 

 

 

+ Recent posts