본문 바로가기

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

[백준] ATM : 11399번 - Python

728x90
반응형

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

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

 (1) [Python] 한 줄에 정수형 변수 여러개 입력받기

-> 리스트에 map 함수를 사용하기!!

'map'은 리스트이 요소를 지정된 함수로 처리해주는 함수이다. map은 원본 리스트를 변경하지 않고 새 리스트를 생성한다.

a = list(map(int, input().split()))
10 20 # (입력)

>>> print(a)
[10, 20]

# a, b = input().split() 이렇게 따로따로 입력받던 것을 간략하게 표현할 수 있음.

 

(2) [Python] 길이가 정해진 리스트 만들기

-> 리스트 길이를 지정한 후 0으로 초기화 하는 반복문 코드를 입력해주기(list comprehension)

list = [0 for i in range(n)]

# 0으로 초기화 된 2차원 배열을 만들고 싶다면 다음과 같이 작성
matrix = [[0 for col in range(n)] for row in range(n)]

 

(3) [Python] 누적 합계 구하기(for)

sum = 0

# 1~10까지 더하기
for i in range(1,11):
	sum += i
print(sum)	# 55출력

 

 

 

문제의 접근 방법

 

- 사람의 명수(n) 입력받기

- n번 사람이 돈을 인출하는 데 걸리는 시간 입력받기

- 인출하는 데 걸리는 시간 누적해서 더하기

- 필요한 시간의 합의 최솟값을 구할 수 있는 방법 생각하기

 

 

 

내가 막혔던 부분

 

(1) 정해진 수만큼 리스트의 길이를 정하는 방법 

(2) 각 사람이 돈을 인출하는 데 걸리는 시간을 누적해서 더하는 방법

(3) 시간의 합의 최솟값을 구할 때, 가능한 경우의 수를 모두 다 더해본 후 그 중 가장 적게 걸리는 값을 구해야 한다고 생각했음 -> 어떤 순서로 줄을 서야 최소의 시간이 걸리는지 생각하지 못했다:(

 

 

 

문제 풀이 방법

 

문제에서 P1~P5를 정렬했을 때, 가장 최소의 시간이 걸린다는 것을 제시해주었다.

 

'문제 내용 중'

 

따라서, Pi를 입력받은 후, 리스트로 만들어서 정렬을 해준 후 각 원소들을 누적해서 더하여 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구할 수 있다!!!

 

 

 

소스코드

n = int(input())
P = [0 for i in range(n)]

sum = 0
min = 0

if (1<=n<=1000):
    P = list(map(int, input().split()))
    
    if len(P) == n:
        P = sorted(P)
        
        for i in range(n):
            sum += P[i]
            min += sum
        print(min)
728x90
반응형