TODAY TIL
다솜이는 사람의 마음을 읽는 기계를 이용해 국회의원 선거에서 자신을 찍지 않을 사람들을 매수하려고 합니다. 목표는 다른 후보들의 득표수를 초과하는 것입니다. 이 글에서는 다솜이가 최소 몇 명을 매수해야 당선될 수 있는지를 계산하는 방법을 설명합니다.
문제 설명
- 입력 조건:
- 후보 수 NN이 주어집니다.
- 각 후보의 득표수가 순서대로 입력됩니다.
- 기호 1번 후보가 다솜이입니다.
- 출력 조건:
- 다솜이가 매수해야 하는 사람의 최소 수를 출력합니다.
- 제약 조건:
- 후보 수 NN: 최대 50
- 각 후보의 득표수: 최대 100
- 예제 입력/출력
입력:
3
5
7
7
출력:
2
해결 방법
문제를 해결하기 위해 다음과 같은 단계로 접근합니다:
- 입력 데이터를 읽기:
- 후보 수와 각 후보의 득표수를 리스트로 저장합니다.
- 다솜이의 득표수는 따로 저장하고, 나머지 후보들의 득표수를 관리합니다.
- 매수 작업 반복:
- 다른 후보들의 득표수를 내림차순으로 정렬합니다.
- 가장 많은 득표수를 가진 후보를 매수하여 다솜이의 득표수를 증가시킵니다.
- 다솜이의 득표수가 다른 모든 후보보다 많아질 때까지 이 작업을 반복합니다.
- 매수 횟수 계산:
- 매수 횟수를 카운트하면서, 다솜이의 득표수가 다른 후보들보다 많아질 때 결과를 출력합니다.
Python 코드
# 입력받기
N = int(input()) # 후보 수
votes = [int(input()) for _ in range(N)] # 각 후보의 득표수
# 초기 설정
dasom_votes = votes[0] # 다솜이의 득표수
other_votes = votes[1:] # 다른 후보들의 득표수
bribes = 0 # 매수한 사람 수
# 매수 작업
while other_votes and max(other_votes) >= dasom_votes:
# 가장 많은 득표수를 가진 후보의 표를 매수
max_index = other_votes.index(max(other_votes)) # 최대값의 인덱스 찾기
other_votes[max_index] -= 1 # 표 매수 (1 감소)
dasom_votes += 1 # 다솜이의 표 증가
bribes += 1 # 매수 횟수 증가
# 결과 출력
print(bribes)
코드 설명
- 입력 처리:
- 후보 수 NN과 각 후보의 득표수를 입력받아 리스트로 저장합니다.
- 다솜이의 득표수는 dasom_votes에, 나머지 후보들의 득표수는 other_votes 리스트로 관리합니다.
- 매수 작업:
- while 루프를 통해 다솜이의 득표수가 다른 후보들의 최대 득표수를 초과할 때까지 반복합니다.
- 가장 많은 득표수를 가진 후보의 표를 하나 매수하고, 다솜이의 득표수를 증가시킵니다.
- 결과 출력:
- 매수 횟수는 bribes 변수에 저장되며, 반복이 끝나면 최솟값이 출력됩니다.
예제 실행
입력
3
5
7
7
출력
2
추가 설명
이 코드의 핵심은 다솜이의 득표수가 다른 후보들보다 많아질 때까지 반복적으로 매수하는 것입니다. 가장 득표수가 많은 후보를 우선 매수하는 전략을 사용하여 최솟값을 계산합니다.
최적화 고려사항
- 후보 수 NN이 최대 50이므로, 매수 작업의 복잡도는 적절한 수준입니다.
- max\text{max} 연산을 사용하는 만큼, 리스트 길이에 따라 작업 시간이 영향을 받을 수 있습니다.
마무리
이 문제는 그리디 알고리즘을 활용하여 반복적으로 최대값을 줄이는 전략을 사용합니다. 매수 전략을 효율적으로 구현하여 다솜이가 국회의원에 당선되도록 만드는 과정을 함께 배웠습니다.
코드와 예제 실행 결과를 참고하여 자신만의 해결 방법을 구현해 보세요! 😊
'python' 카테고리의 다른 글
99클럽 코테 스터디_4기 25일차 TIL (0) | 2024.11.23 |
---|---|
99클럽 코테 스터디_4기 24일차 TIL (0) | 2024.11.21 |
99클럽 코테 스터디_4기 22일차 TIL (0) | 2024.11.19 |
99클럽 코테 스터디_4기 21일차 TIL (0) | 2024.11.18 |
99클럽 코테 스터디_4기 20일차 TIL (0) | 2024.11.17 |