Algorithm/Implementation

(Python/파이썬) - 백준(BOJ) 2238번 : 경매

하눤석 2022. 7. 8. 10:19
728x90

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

 

2238번: 경매

첫째 줄에 두 정수 U(1 ≤ U ≤ 10,000), N(1 ≤ N ≤ 100,000)이 주어진다. U는 금액의 상한이고, N은 경매에 참여한 회수이다. 다음 N개의 줄에는 사람 이름 S(공백 없는 알파벳 대소문자 10자 이하)와, 그

www.acmicpc.net


  • 문제 : 

경매는 여러 사람이 하나의 물건을 사려고 할 때, 각 사람이 원하는 가격을 제시하면 그 중 가장 높은 가격으로 물건을 팔게 되는 방식이다. 이러한 고전적인 경매 방식은 꽤 널리 쓰이는데, 최근에는 인터넷 쇼핑몰에서 반대의 경매 방식을 택하기도 한다. 즉, 여러 사람이 가격을 제시하면, 그 중 가장 낮은 가격으로 물건을 팔게 되는 방식도 쓰인다.

 

하지만 이럴 경우, 모든 사람들이 1원에 물건을 사겠다고 하는 사태가 발생할 수 있다. 따라서 같은 가격을 제시한 사람이 둘 이상일 경우에는 무효로 하는 방식이 쓰인다. 하지만 모든 가격을 여러 사람이 제시하는 경우도 있을 수 있기 때문에, 다음과 같은 방식으로 경매 당첨자를 선택하기로 한다.

 

우선 가장 적은 수의 사람이 제시한 가격을 찾는다. 이러한 경우가 여럿 있다면, 가장 낮은 가격으로 물건을 팔게 된다. 이때, 그 가격을 제시한 사람들 중에서 가장 먼저 제시한 사람이 물건을 살 수 있게 된다.

 

각각의 사람들이 제시한 가격이 주어졌을 때, 경매에 낙찰(당첨)되는 사람을 구하는 프로그램을 작성하시오.

 

 

 

 


  • 풀이 :

구현 문제입니다.

 

풀이는 총 3단계로 구현됩니다.

 

1. index를 입찰 가격으로 하여 가격 별 경매인원의 이름을 담을 p, 가격 별 경매인원의 수를 담을 num, 가장 적은 경매인원인 m을 사용합니다.

 

2. 입력받은 경매인원과 경매가격을 배열에 삽입합니다.

 

3. num 배열을 탐색하여 가장 낮은 경매인원의 수를 m으로 찾고 num 배열의 해당 값을 찾아서 0번째 이름을 출력합니다.

 

 

 


  • 소스코드 : 
import sys
input = sys.stdin.readline

U,N = map(int,input().split())
p = [[] for _ in range(10001)]
num = [0 for _ in range(10001)]
m = 10001
for _ in range(N):
    name, price = input().split()
    price = int(price)
    p[price].append(name) # 가격별 경매인원 정리
    num[price] += 1 # 가격별 경매인원 카운트
for i in range(10001): 
    if num[i] != 0:  #최소 경매인원이 몇명인지
        m = min(num[i],m)
for i in range(10001): # 최소 경매인원이 있는 가장 낮은 가격을 찾는다.
    if m == num[i]:
        print(p[i][0],i)
        break
320x100