[백준] 3649.로봇 프로젝트

jeongjeong2·2023년 5월 13일
0

For coding test

목록 보기
45/59

문제 바로가기

문제 풀이

  • two pointer로 문제를 푸는 것이 익숙하지 않아서 itertools의 combination을 이용했다 -> 당연하게도 모든 경우를 확인하는 것이니 시간 초과가 발생
  • 따라서 two pointer로 문제를 해결하려했다. sorted(list)에서 left, right를 지정하고 비교 대상과 크기를 비교해서 경우에 따라 left += 1, right -= 1로 값을 변화시키며 경우를 탐색하였다.
  • testcase가 여러개 주어진다는 것은 확인했지만 실제 테케는 1개만 주어져있어서 처음엔 고려하지 못햇었다 (25%에서 오답처리) -> 여러가지 시도해보았으나 try,except 구문을 이용해서 해결했다.

정답 코드

import sys

input = sys.stdin.readline
# combination 활용 -> 시간초과
# two pointer 사용

while True:
    try:
        hole = (int(input()))*10**7
        n = int(input())
        pieces = sorted([int(input()) for _ in range(n)])
        answers = {}
        left, right = 0, n-1
        while left < right:
            if pieces[left] + pieces[right] < hole:
                left += 1
            elif pieces[left] + pieces[right] > hole:
                right -= 1
            else:
                answers[pieces[right]-pieces[left]] = [pieces[left], pieces[right]]
                break
        if answers:
            print('yes', answers[max(answers.keys())][0], answers[max(answers.keys())][1])
        else:
            print('danger')
    except: # 입력 값이 없는 경우 예외처리하는 방법
        break

추가적인 개념 (optional)

try-except 구문에 대한 이해 -> except에 error의 종류를 기재해서 특정 에러일 때 어떤 행동을 할지 결정할 수 있다. 이번 문제의 경우에는 EOFError였지만 그 외의 error는 발생하지 않았기 때문에 굳이 조건으로 설정하지 않았다.

(ㅎr.....)

0개의 댓글