본문 바로가기
Problem Solving/Greedy

[그리디] 백준 10775번: 공항 / 골드2

by ggyongi 2021. 5. 31.
반응형

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

 

10775번: 공항

예제 1 : [2][?][?][1] 형태로 도킹시킬 수 있다. 3번째 비행기는 도킹시킬 수 없다. 예제 2 : [1][2][3][?] 형태로 도킹 시킬 수 있고, 4번째 비행기는 절대 도킹 시킬 수 없어서 이후 추가적인 도킹은 불

www.acmicpc.net

<시간 초과 코드>

import sys
n = int(sys.stdin.readline())
m = int(sys.stdin.readline())

gate = [0]*(n+1)
count = 0
for i in range(m):
    num = int(sys.stdin.readline())
    
    docking = False
    for j in range(num,0,-1):
        if gate[j]==0:
            gate[j]=1
            count +=1
            docking = True
            break
    if not docking:
        break
print(count)

가능한 한 큰 게이트로 도킹하는 방식으로 그리디하게 접근했다.  

그런데 처음 방법으로는 71퍼에서 시간 초과가 발생했다. 그래서 다른 방법을 생각해보다가

도저히 방법이 떠오르질 않아 위의 코드를 개선시켰다.

 

이중으로된 for문 안에서 num부터 하나씩 빼가며 빈 곳을 찾는 방식이었는데

딕셔너리 하나를 더 추가해서 빈 곳을 찾으면 그 값을 저장시켰다. 이렇게 되면

다음부터 동일한 num을 받더라도 num에서부터 빈 곳을 찾는 게 아니고

테이블에 저장된 곳부터 찾아나가기 때문에 훨씬 시간이 절약된다.

import sys
n = int(sys.stdin.readline())
m = int(sys.stdin.readline())

table = {}
for i in range(1,n+1):
    table[i] = i

gate = [0]*(n+1)
count = 0
for i in range(m):
    num = int(sys.stdin.readline())

    docking = False
    for j in range(table[num],0,-1):
        if gate[j]==0:
            gate[j]=1
            table[num]= j-1
            count +=1
            docking = True
            break
    if not docking:
        break
print(count)
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글