본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 소가 길을 건너간 이유 3 : 14469번 - Python

728x90
반응형

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

 

14469번: 소가 길을 건너간 이유 3

첫 번째 소는 2초에 도착하고 3초에 농장을 입장한다. 그 다음에는 세 번째 소가 5초에 도착하여 12초에 농장을 입장한다. 마지막으로 두 번째 소가 8초에 오는데, 세 번째 소가 검문을 받고 있으

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 오름차순 정렬

- 반복문 속 조건문 사용

- 소가 도착했을 때, 기다릴 필요가 있는지 없는지 여부에 따라 구현

 

 

 

내가 막혔던 부분

 

아이디어는 같았지만 코드 짜는 방식에 있어서 오답과 정답으로 나뉘었다.

# 처음 짰던 코드 (오답 코드)

n = int(input())

arr = []

for _ in range(n):
    a,b = map(int, input().split())
    arr.append([a,b])

arr.sort()

time = 0

for i in range(len(arr)-1):
    time = arr[i][0] + arr[i][1]
    if time > arr[i+1][0]:
        time = time + arr[i+1][1]

print(time)

위 코드의 정확한 오답 원인은 알아내지 못했지만 조건에 따라 값을 처리해주는 로직을 정확히 나눠서 실행되도록 수정했더니 정답이 나왔다!

 

 

 

문제 풀이 방법

 

n마리의 소를 의미하는 n값을 입력받기 -> n번만큼 반복문을 돌려 소의 도착 시각(a), 검문시간(b)를 입력 받아서 2차원 배열로 리스트 arr에 추가하기 -> 최소 시간을 측정하기 위해서 리스트 arr를 도착시각(a)을 기준으로 오름차순 정렬하기 -> 최소 시간을 계산해서 넣을 변수 time 선언 -> 두 가지 상황에 따라 처리해주기 -> 최소 시간 출력!

 

 

 

소스코드

# 정답 코드

n = int(input())

arr = []

for _ in range(n):
    a,b = map(int, input().split())
    arr.append([a,b])

arr.sort()	# 빨리 도착한 소부터 넣어주어서 최소한의 시간으로 들어오게 만들기

time = 0

for i in range(len(arr)):
    if time > arr[i][0]:	# 다음 소가 이전 소가 검문 받고 있는 중에 도착 했을 때
        time = time + arr[i][1]	# 기다린 시간이 존재하므로 이전 소의 입장 시간 + 다음 소의 검문 시간
    else:	# 이전 소가 검문을 다 받은 후 도착 했을 때
        time = arr[i][0] + arr[i][1]	# 기다린 시간이 없으므로 다음 소 도착 시간 + 그 소의 검문 시간

print(time)

 

728x90
반응형