본문 바로가기

알고리즘/백준

[백준] 3649번 : 로봇 프로젝트

728x90

3649번: 로봇 프로젝트

 

3649번: 로봇 프로젝트

각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에

www.acmicpc.net

🤔 문제분석

이분탐색 혹은 투포인터로 문제를 해결 할 수 있으나 이분탐색 풀이법으로 문제를 해결하였습니다. 레고를 사이즈 오름차순으로 정렬한뒤에 순회하는데 i번째를 순회할때 (i+1, N)까지 이분탐색을 통하여 (arr[i] + arr[mid])값이 블록의 사이즈랑 맞을경우는 후보에 두고, 블록 사이즈보다 작다면 start를 mid+1로 크다면 end를 mid-1로 두어 좁혀가며 탐색을 한다.

후보들을 모두 구한뒤에 그중에서 절대값의 차가 가장 높은 값을 갱신하여 출력하면된다.

투포인터 방법으로는 left를 0 right를 N-1로 둔 뒤에, 합 값이 레고사이즈보다 크다면 right를 감소시키고, 레고 사이즈보다 작다면 left값을 증가시켜가면서 레고사이즈랑 같은 값을 찾은뒤에 그중 절대값의 차가 가장 큰 값을 찾으면 된다.

💻 코드

import sys
input = sys.stdin.readline

while True:
    try:
        x = int(input())
        n = int(input())
        lego = []
        for _ in range(n):
            lego.append(int(input()))
            
        lego.sort()
        max_cost = -1
        l1, l2 = -1, -1
        checker = x * (10**7)
        for i in range(n):
            start = i+1
            end = n-1
            while end >= start:
                mid = (start+end)//2
                cost = lego[i] + lego[mid]
                if cost == checker:
                    if abs(lego[i] - lego[mid]) > max_cost:
                        max_cost = abs(lego[i] - lego[mid])
                        l1, l2 = i, mid
                        
                    break
                elif cost > checker:
                    end = mid - 1
                else:
                    start = mid + 1
        
        if l1 != -1 and l2 != -1:
            print("yes", lego[l1], lego[l2])
        else:
            print("danger")
    except:
        break

🎯 피드백 및 개선사항

골드5 정도의 정렬 알고리즘 문제는 이제 쉽게 풀리는것 같습니다. 어떠한 유형이 나오고 어떻게 접근해야할지 감이 잡혀나아가고 있습니다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2141번 : 우체국  (0) 2024.02.18
[백준] 1826번 : 연료 채우기  (1) 2024.02.17
[백준] 1374번 : 강의실  (0) 2024.02.16
[백준] 1083번 : 소트  (0) 2024.02.16
[백준] 1911번 : 흙길 보수하기  (0) 2024.02.15