본문 바로가기
알고리즘/2차원 배열

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

by 영재진 2023. 1. 16.

문제 설명

 

처음 문제를 봤을때 쉽게 풀고 넘어갈 줄 알았다. 하지만 틀려버렸다. 

참 단순한 이유로 틀렸지만 기록해 둘 필요가 있을 것 같다.

 


 

1. 첫 번째 풀이(오답)

# 최댓값

field = []

for _ in range(9):
    field.append(list(map(int, input().split())))

max_value = 0
row = 0
col = 0

for i in range(9):
    for j in range(9):
        if field[i][j] > max_value:
            max_value = field[i][j]
            row = i+1
            col = j+1

print(max_value)
print(row, col)

언뜻 보면 큰 문제가 없어 보이지만 오답이다. 한참을 고민하다가 다른 분들의 코드를 여러 가지 찾아보니 이유를 알 수 있었다. 

 

위의 문제를 다시 확인해 보면, 9 x 9 격자판에는 자연수와 0이 들어간다.

나의 코드는 격자판을 탐색하다가 0을 만나는 경우엔 0의 위치를 저장하지 못한다. 

만약 모든 격자판의 값이 0이라면, 정확한 결과를 도출하지 못한다.

 

해결 방법

 

1. max_value를 -1로 초기화한다. 

2. field[i][j] >= max_value로 변경한다.

 


2. 두 번째 풀이 

# 최댓값

field = []

for _ in range(9):
    field.append(list(map(int, input().split())))
# 값 하나씩 탐색하며 최댓값을 찾는다.
max_value = 0
row = 0
col = 0

for i in range(9):
    for j in range(9):
        if field[i][j] >= max_value:
            max_value = field[i][j]
            row = i+1
            col = j+1

print(max_value)
print(row, col)

두 번째 해결책을 적용한 코드이다. 

 

하지만 이 코드의 경우 같거나 큰 값을 만나면 바로 row, col 값이 변경된다. (무조건 나중에 탐색되는 값의 위치가 반환된다.)

이 문제의 경우 최댓값이 두 개 이상일 때 그중 어느 것의 위치를 반환하더라도 정답으로 인정되는 문제이지만,

가끔씩 행과 열의 값이 더 작은 것을 반환해야 한다든지 등등 ... 여러 개의 값 중에서 반환해야 하는 값의 조건이 더 붙는 경우가 있으므로 주의해야 한다.