광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

문제

https://www.acmicpc.net/problem/2566

주어진 9*9 배열에서 최댓값을 찾고, 최댓값과 좌표를 출력하시오.

 

Reference

https://dev-won0313.tistory.com/entry/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%A0%84%EC%B2%B4-%EA%B0%92-%EC%A4%91-%EC%B5%9C%EB%8C%80-%EC%B5%9C%EC%86%8C-%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0

 

[Python] 파이썬 2차원 배열 전체 값 중 최대, 최소 값 구하기

2차원 리스트 전체 값 중에서 최대, 최소 값을 구할 때 흔히 max(리스트)를 넣어본 경험이 있을 겁니다.하지만, 원하는 값이 나오지 않습니다.보통 최대, 최소, 정렬 등 계산이 들어가는 함수는 대

dev-won0313.tistory.com

https://minjoos.tistory.com/2

 

[python] 2차원 리스트 생성 및 입력 받기, 원하는 값 찾기, 탐색, 전치 행렬

'본 포스팅은 글쓴이 개인의 공부 목적이므로, 틀린 부분이 있다면 댓글로 달아주시면 감사하겠습니다.' 오늘은 2차원 리스트에 대해 알아보겠다. 1. 2차원 리스트의 구조 2차원 리스트는 1차원

minjoos.tistory.com

 

풀이

요즘 부트캠프를 듣는데, 거기 강사님이 항상 하시는 말씀이 주석 많이 달아라+코드 짜기 전에 설계부터 해봐라(뭘 어떻게 구현할지)임. 그래서 이번 풀이도 그렇게 해봤다.

 

이번 문제의 코드는 총 3단계… 아니 모듈은 빼… 어차피 sys 불러오는게 다임. 출력도 뭐 없으니가 걍 빼셈. 그래서 3단계가 뭔데요? 일단 2차원 배열 만들고, 2차원 배열에서 최댓값을 찾고, 최댓값 좌표 찾을거다.

 

2차원 배열 생성

array = [0 for i in range(9)]
coord_list = [] # 최댓값 인덱스 저장할 리스트

for i in range(9): 
    array[i] = list(map(int, sys.stdin.readline().split()))
# 배열 만들기가 너무 힘듭니다

coord_list는 최댓값 인덱스 저장하는 리스트고, 2차원 배열은 array에 만들거다. 이거는 예전에 2차원 배열 만들었던 거 활용해서 list, map 써서 만들었음. 최종 제출은 9*9인데 테스트 하면서 9*9 입력하기 귀찮아서 테스트는 3*3으로 먼저 했다.

 

최댓값을 찾아서

# 여기서 끝이 아니다. 최댓값 찾아야 한다. 
# 2차원 배열은 max 두개 겹치면 될 줄 알았죠? 나도 그렇게 생각했어요. 
arr_max = max(map(max, array))

이게요… 지금 한줄로 압축된거지 진짜 개삽고생도 이런 개삽고생이 없었어요… 아니 2차원 배열인데 max 두 번 하면 되지 않아요? 그렇게 생각했던 시절이 나한테도 있었어… 근데 max 두 번 주면 어떻게 되게?

 

[[1, 6, 65], [35, 47, 38], [8, 13, 21]] 47

이 배열의 최댓값은 65인데 뜬금포로 47이 왜 나오는겨? 그래서 방법 찾다가 map을 알게 된 것이다. 일단 왜 65가 아니라 47이 최댓값이 된 건지부터 알아보자.

 

[[6, 8, 13], [35, 31, 23], [22, 70, 54]] 35 70 # 1
[[1, 99, 90], [48, 7, 32], [9, 44, 54]] 48 99 # 2
[[33, 68, 73], [22, 82, 10], [11, 95, 74]] 73 95 # 3
[[13, 22, 71], [66, 21, 2], [40, 48, 29]] 66 71 # 4
[[11, 73, 75], [1, 88, 90], [5, 7, 2]] 75 90 # 5

이 배열들은 내가 왜 그런지를 보기 위해 테스트용으로 만들어본 배열이다. [] 안에 있는 게 배열이고 그 옆은 max 두 번 겹쳐서 쟤가 최댓값이라고 내놓은 결과물이고 맨 오른쪽은 진짜 최댓값. 그니까 map 줘서 찾은 최댓값 말하는거다. 잘 보면 max 두 번 줘서 최댓값이라고 내놓은 값들이 어디에 있나요?

[35, 31, 23] -> 35
[48, 7, 32] -> 48
[33, 68, 73] -> 73
[66, 21, 2] -> 66
[11, 73, 75] -> 75

이제 이 배열의 0번째 값을 다른 행의 0번째 값과 비교해보자. 어? 최댓값이 들어있는 행의 0번째 값보다 큰데요? 그게 문제라는거다. 진짜 최댓값이 숨어있는 행의 0번이 작은 수면 max만 두 번 써서는 아예 다른 행으로 가버린다는 것.

 

[75, 90, 7] 90

왼쪽은 list(map(max, array)), 오른쪽은 max(map(max, array))를 준 결과이다. 쟤는 어떻게 최댓값을 찾았냐면 행마다 제일 큰 값을 찾아서 1차원 배열로 만든 다음 거기서 다시 최댓값을 찾은 것이다. 그래서 찐 최댓값이 나온 것. 여기까지 이해 하셨죠?

 

배열에서 최댓값 좌표 찾기

# 9*9 배열로 고정되어있음
for x in range(9):
    for y in range(9):
        # 배열의 인덱스 값이 최댓값임?
        if array[x][y] == arr_max:
            # 어 내놔 근데 1 더해서(파이썬은 0부터 셈)
            coord_list = [x+1,y+1]

여기는 아까보다 쉽다. x랑 y는 각각 0부터 8까지가 되고, 이게 배열의 좌표가 된다. 그리고 [0][0]부터 시작해서 쭉 배열 순회를 돌다가 최댓값(아까 찾아서 변수에 저장함)을 발견하면 좌표를 아까 선언했던 좌표 리스트에 넣어두면 되는데! 아니! 넣지마! 아직 넣지마!!! 그냥 넣으면 틀려!!!

 

파이썬 인덱싱은 0부터 시작인데 우리 좌표 출력할때 1부터 시작하잖음. 그러면 최댓값이 3열 4행에 있으면 3, 4가 나와야 되는데 2, 3이 나온다. 그럼 어떻게 하냐고? 각 좌표에 1 더하십쇼.

 

import sys

array = [0 for i in range(9)]
coord_list = [] # 최댓값 인덱스 저장할 리스트

for i in range(9): 
    array[i] = list(map(int, sys.stdin.readline().split()))
# 배열 만들기가 너무 힘듭니다

# 여기서 끝이 아니다. 최댓값 찾아야 한다. 
# 2차원 배열은 max 두개 겹치면 될 줄 알았죠? 나도 그렇게 생각했어요. 
arr_max = max(map(max, array))

# 9*9 배열로 고정되어있음
for x in range(9):
    for y in range(9):
        # 배열의 인덱스 값이 최댓값임?
        if array[x][y] == arr_max:
            # 어 내놔 근데 1 더해서(파이썬은 0부터 셈)
            coord_list = [x+1,y+1]

print(arr_max) # 최댓값
print(*coord_list) # 찍어라 좌표

이거… 내기 전에 한가지 확인하셔야 할 게 있다. 좌표 출력하는데 그냥 coord_list 내놓고 이 코드 따라했는데 틀렸잖아요!! 하지 마십쇼. 출력 형식이 x, y라 배열 안에서 걔네를 꺼내야 하니까. 아니 그럼 님은 뭐 했는데요? 저기 배열 이름 옆에 애스터리스크(*) 보임? 언패킹 해서 냈음.

반응형

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 15439번 풀이  (0) 2025.12.03
백준 27433번 풀이  (0) 2025.12.03
백준 13909번 풀이  (0) 2025.12.01
백준 17103번 풀이  (0) 2024.04.13
백준 4134번 풀이  (0) 2024.03.13