문제 : https://www.acmicpc.net/problem/2303
N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이기게 된다. 세 장의 카드가 (7, 8, 10)인 경우에는 합은 7+8+10 = 25가 되고 일의 자리 수는 5가 된다. 어떤 사람이 받은 카드가 (7, 5, 5, 4, 9)인 경우 (7, 4, 9)를 선택하면 합이 20이 되어 일의 자리 수는 0이 되고, (5, 5, 9)를 선택하면 합이 19가 되어 일의 자리 수는 9가 된다. 게임을 이기기 위해서는 세 장의 카드를 선택할 때 그 합의 일의 자리 수가 가장 크게 되도록 선택하여야 한다.
예를 들어, N=3일 때
- 1번 사람이 (7, 5, 5, 4, 9),
- 2번 사람이 (1, 1, 1, 1, 1),
- 3번 사람이 (2, 3, 3, 2, 10)의
카드들을 받았을 경우, 세 수의 합에서 일의 자리 수가 가장 크게 되도록 세 수를 선택하면
- 1번 사람은 (5, 5, 9)에서 9,
- 2번 사람은 (1, 1, 1)에서 3,
- 3번 사람은 (2, 3, 3)에서 8의
결과를 각각 얻을 수 있으므로 첫 번째 사람이 이 게임을 이기게 된다.
N명에게 각각 다섯 장의 카드가 주어졌을 때, 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람을 찾는 프로그램을 작성하시오. 가장 큰 수를 갖는 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.
입력
첫 줄에는 사람의 수를 나타내는 정수 N이 주어진다. N은 2이상 1,000이하이다. 그 다음 N 줄에는 1번부터 N번까지 각 사람이 가진 카드가 주어지는 데, 각 줄에는 1부터 10사이의 정수가 다섯 개씩 주어진다. 각 정수 사이에는 한 개의 빈칸이 있다.
출력
게임에서 이긴 사람의 번호를 첫 번째 줄에 출력한다. 이긴 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.
📌 문제 탐색하기
각 사람별로 합을 구한 뒤 일의 자리 수가 가장 큰 값을 구해서 배열에 넣고, 모든 사람별로 해당 값을 비교해야 한다.
이를 위해서 고민해야 할 과정들이 좀 있었다. 일단 생각해본 흐름은 다음과 같다.
1. 전체 사람 수 만큼 for 문 반복
2. 각 사람별로 5개 숫자 합 구하기 -> sum()
3. 5개 숫자 합에서 중첩 for문 사용해서 2개 숫자 택하여 그 합만큼 빼기
4. 3개 값의 합에서 일의 자리수만 추출
5. 일의 자리수를 배열에 넣기
6. 배열들 중에서 max() 값 구하기 -> 새로운 배열에 넣기
7. for 문에서 모든 사람들의 일의 자리 max 값 구하여 배열에 넣기
8. 배열 중에서 가장 큰 값 구하기
9. 큰 값의 배열 인덱스 반환 -> .index()
일단 방식은 이런데 여기서 문제되는 바는 일의 자리수를 어케 구하는지이다.
-> 생각해보니 방식은 간단했다.
-> 숫자에 %10을 한 값을 구하면 된다...ㅎ
-> 예를 들어 367%10을 하면 일의 자리 7을 구할 수 있다.
📌 시도 회차 수정 사항
[1회차]
코드를 돌아보니 '이긴 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다'라는 조건을 고려하지 못했다.
- 배열 값의 인덱스 번호를 구하는 함수는 arr.index()
- arr.index()는 동일한 값이 여러개일 경우, 첫 번째 인덱스를 반환한다.
- 그러나 문제에서 요구하는 값은 첫 번째 인덱스가 아니라, 가장 번호가 큰 인덱스 번호이다.
-> 가장 큰 인덱스 번호를 구하기 위해서는 배열을 뒤집고, 구한 인덱스 번호를 이용해야 한다.
-> [::-1] : 배열을 뒤집는 슬라이싱 기법
compareArray = [3, 5, 5, 2, 5]
reversed_array = compareArray[::-1]
print(reversed_array) # 출력: [5, 2, 5, 5, 3]
reversed_array = [5, 2, 5, 5, 3]
print(reversed_array.index(5)) # 출력: 0
그 다음으로 이제 원래 배열에서의 인덱스 번호로 변환하여 최종 인덱스 값을 출력해야 한다.
원래 인덱스 = 전체 길이 - 1 - (뒤집힌 리스트의 인덱스)
📌 정답 코드
import sys
input=sys.stdin.readline
N=int(input().strip())
compareArray=[]
for _ in range(N):
arr=[]
newArray=[]
total=0
arr=list(map(int,input().split()))
total=sum(arr)
for i in range(5):
for j in range(5):
if i!=j:
newArray.append((total-(arr[i]+arr[j]))%10)
compareArray.append(max(newArray))
answer=max(compareArray)
max_index = len(compareArray) - compareArray[::-1].index(answer)
print(max_index)
해설 : https://whydevsaysno.notion.site/a5a18080fc2942b9a73b894eefe93c99
'코딩테스트' 카테고리의 다른 글
[Python] 백준 11866 : 요세푸스 문제 0 (3) | 2025.01.26 |
---|---|
[Python] 백준 2193 : 이친수 (1) | 2025.01.25 |
[Python] 백준 2204 : 도비의 난독증 테스트 (1) | 2025.01.22 |
[Python] 백준 2644 : 촌수계산 (2) | 2025.01.21 |
[Python] 백준 11724 : 연결 요소의 개수 (1) | 2025.01.20 |