본문 바로가기
Algorithm/baekjoon

[백준] 2566번 최댓값 파이썬 (python)

by eoieiie 2024. 3. 24.

 

2566번: 최댓값

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

www.acmicpc.net

 

문제


<그림 1>과 같이 9×9 격자판에 쓰인 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

 

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

 

입력


첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

 

 

출력


첫째 줄에 최댓값을 출력하고, 둘째 줄에 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그중 한 곳의 위치를 출력한다. 

 

정답코드


table = [list(map(int, input().split())) for _ in range(9)]

max_num = 0
max_row, max_col = 0, 0
for row in range(9):
    for col in range(9):
        if max_num <= table[row][col]:
            max_row = row + 1
            max_col = col + 1
            max_num = table[row][col]

print(max_num)
print(max_row, max_col)

 

풀이


  1. 리스트 컴프리핸션으로 행렬을 입력받고, 
  2. 초기 최댓값인 0을 저장한 max_num, 행과 열의 인덱스를 저장할 max_row 그리고 max_column을 초기화한다. 
  3. 행렬의 각 요소를 순회하며 다음과 같은 검사를 진행한다:


    1. 만약 해당 수가 최댓값보다 크다면
    2. max_num을 해당 수로 초기화한다.
    3. 코드에는 없지만 만약 최댓값보다 크지 않다면 그냥 넘어간다.

  4. 그렇게 모든 행렬을 다 흝어보는 것이 끝나면
  5. 원하는 내용을 출력해준다.

느낀 점


내가 구현한 로직은 다음과 같다:

 

  1. 9 * 9 행렬을 만들기
  2. 그중 최댓값을 먼저 찾기
  3. 행렬을 순회하면서 최댓값과 비교하기
  4. 만약 최댓값이 나오면, 해당 값의 위치를 판별하기
num_list = [list(map(int, input().split())) for _ in range(9)]
max_value = max(max(row) for row in num_list)

for i, row in enumerate(num_list):
    if max(row) == max_value:  # if max_value in row:
        max_index = (i * 9) + row.index(max(row))

row_position = max_index // len(num_list) + 1
column_position = max_index % len(num_list) + 1

print(max_value)
print(row_position, column_position)

 

풀이는 다음과 같다:

 

  1. 우선 사용자로부터 9줄에 걸쳐서 각 줄마다 숫자를 입력받아 2차원 리스트 num_list안에 저장한다.
  2. num_list의 각 행을 순회하며, 존재하는 값들의 최댓값을 찾는다. 
  3. 각 행마다 구한 최댓값 중 가장 큰 수를 max_value 안에 넣는다. 

num_list = [list(map(int, input().split())) for _ in range(9)]
max_value = max(max(row) for row in num_list)

이제 다시 한번 순회를 하며 각 값이 최댓값과 동일한지 알아보는데, 만약 같다면 해당 위치를 기반으로

우선 2차원 행렬의 인덱스를 1차원 인덱스로 축소하여 max_index안에 넣어준다.

 

max_index = (i * 9) + row.index(max(row))

9개의 행이 존재하므로 행은 max_index를 9로 나눈 몫이며, 인덱스는 0부터 시작하므로 1을 더해준다. 

열은 max_index를 9로 나눈 나머지가 된다. 동일한 이유로 1을 더해준다. 

 

마지막으로는 원하는 값을 출력한다. 

 

 

 

 

 

 

댓글