문제 링크


백준 온라인 저지 2562번 - 최댓값 문제해설


문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.


예제 입력

3
29
38
12
57
74
40
85
61

예제 출력

85
8



해설

문제를 해설하기 전 아래 코드를 살펴보자. 10개의 숫자가 저장된 리스트에서 최댓값을 구하는 예제 코드이다.

numbers = [15, 20, 4, 77, 53, 23, 29, 31, 100, 63]

maxNumber = 0       # 최댓값을 기록하는 변수
for i in range(10):
    if numbers[i] > maxNumber:  # 만약 현재 값이 기존 최댓값보다 크다면
        maxNumber = numbers[i]  # 최댓값을 바꿔준다.

print(maxNumber)    # 100 출력

최댓값을 기록하기 위한 임시변수 maxNumber를 만들고 반복문을 통해 리스트 내의 모든 숫자와 비교하면서 maxNumber를 갱신한다. 이때 주의해야 할 점은 maxNumber의 초깃값이 리스트 내의 가장 큰 수보다 작아야 한다는 것이다. 그렇지 않다면 리스트 내 maxNumber보다 큰 수가 없음므로 엉뚱한 결과가 나올 수 있다.


위 코드와 같이 입력받은 수를 리스트에 저장한다면 첫 번째 출력인 최댓값을 얻을 수 있을 것이다. 그렇다면 최댓값이 몇 번째로 입력되었는지 어떻게 알 수 있을까?

배열 이미지

그 비밀은 리스트의 색인(인덱스)에 있다. 입력된 값을 순서대로 리스트에 넣어주었다면 값이 저장된 색인의 번호가 입력된 순서가 된다. 여기서 주의해야 할 점은 코딩에서 색인이 0부터 시작되기 때문에 +1을 해주어야 우리가 인지하는 순서 값과 동일해진다.

최댓값이 바뀔 때 색인을 기록하는 임시변수 maxIndex를 만든다면 아래와 같이 답안 코드를 작성할 수 있다.


답안 코드

numbers = list()
for i in range(9):    # 9개의 수를 입력 받는다.
    n = int(input())
    numbers.append(n)

maxNumber = 0         # 최댓값을 기록하는 변수
maxIndex = 0          # 최댓값의 색인을 기록하는 변수
for i in range(9):
    if numbers[i] > maxNumber:   # 기존 최댓값보다 크다면
        maxNumber = numbers[i]   # 최댓값을 갱신한다.
        maxIndex = i             # 최댓값의 색인을 갱신한다.

print(maxNumber)      # 최댓값을 출력
print(maxIndex + 1)   # 최댓값의 위치를 출력

여기서 특이한 점은 maxIndex가 가진 색인으로 리스트의 최댓값에 접근할 수 있기 때문에 maxNumber 사용하지 않도록 코드를 작성하여 변수를 하나 줄이는 것이 가능하다.

numbers = list()
for i in range(9):
    n = int(input())
    numbers.append(n)

maxIndex = 0
for i in range(9):
    if numbers[i] > numbers[maxIndex]:    # 색인을 통한 최대값 구하기
        maxIndex = i

print(numbers[maxIndex])
print(maxIndex + 1)