일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 다이나믹 프로그래밍
- DP
- DFS
- 문자열
- 너비우선탐색
- 파이썬
- 그리디 알고리즘
- 데이터베이스
- 백트래킹
- 브루트포스
- SW Expert Academy
- 그래프 탐색
- 그래프 이론
- 자바스크립트
- SWEA
- 백준 알고리즘
- 다익스트라
- 브루트포스 알고리즘
- 오라클
- 구현
- oracle
- 백준알고리즘
- 너비 우선 탐색
- 프로그래머스
- BFS
- 스택
- 완전탐색
- Python
- javascript
- 깊이우선탐색
- Today
- Total
민규의 흔적
[Python 파이썬]백준 2566번 - 최댓값 본문
2023년 5월 5일
문제 링크 : 백준 2566번 - 최댓값
문제
<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.
예를 들어, 다음과 같이 81개의 수가 주어지면
이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.
입력
첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.
출력
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.
알고리즘 분류
- 구현
문제 접근
2차원 배열을 선언할 필요 없이, 각 행을 입력 받을 때마다 현재 검사하는 데이터를 기존 최댓값 정보와 비교하여 조건이 충족되면 갱신하는 방향으로 로직을 구성하였다.
순서도
1. 최댓값을 담을 변수, 최댓값의 행과 열 정보를 담을 변수를 선언한다.
2. for문을 통해, 총 9개의 행 정보를 각각 입력 받는다.
3. 2중for문을 통해, 각 행의 9개의 각 열 정보를 하나씩 검사한다
3-1. 검사한 데이터가 지금까지의 최댓값보다 크다면 최댓값과 해당 데이터의 행과 열 정보를 갱신한다.
4. 주어진 전체 행렬의 최댓값과 최댓값의 위치 정보를 출력한다.
입력 예제
3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80
첫 번째 행, [ 3 23 85 34 17 74 25 52 65 ] 을 입력받는다.
입력받은 행의 왼쪽부터 최댓값과 검사를 진행하고, 해당 방식을 9행 모두에 진행한다.
해당 과정을 모두 거치면 최댓값은 90으로 픽스되며, 90의 위치 값을 받아놓고 출력하면 다음과 같다.
출력 예제
90
5 7
주의할 점
- 딱히 주의할 점은 없지만, 나는 최댓값, 최댓값의 행, 최댓값의 열 값을 담을 변수의 각각 초기값을 0,0,0으로 선언했다가 한 번 틀렸었다. 이유는 모든 입력 값이 0일 때, 지금까지의 최댓값보다 '클 때' 최댓값을 갱신하는 로직으로 수행하면 출력 값이 다음과 같게 된다.
0
0 0
행렬은 1행 1열부터 시작하기에, 초기값 세팅과 로직을 나처럼 정의한 경우에는 예외사항이 생기게 되니 조심해야 한다.
전체 코드
# 2566
max_num = -1 # 최댓값을 담을 변수
max_row = 0 # 최댓값의 위치 중, 행 값을 담을 변수
max_col = 0 # 최댓값의 위치 중, 열 값을 담을 변수
# 9개의 행 데이터가 주어짐
for row in range(9):
# 데이터들을 한 행 씩 받음
temp_arr = list(map(int,input().split()))
# 각 행은 9개의 열로 이루어져 있음
for col in range(9):
# 입력받은 행 값을 하나씩 검사함
# 만약 검사중인 값이 최댓값보다 크다면 최댓값, 행 값, 열 값을 갱신 시켜줌.
if temp_arr[col] > max_num:
max_row = row + 1
max_col = col + 1
max_num = temp_arr[col]
print(max_num)
print("%d %d"%(max_row, max_col))
풀이 후기
문제 자체는 접근부터 풀이까지 순조롭게 진행되었는데, 주의할 점에서 언급한 바와 같은 이유로 '틀렸습니다' 통보를 받으니 순간 머리가 띵했다. 문제가 쉬워도 무시하지 말자.
'BOJ' 카테고리의 다른 글
[Python 파이썬]백준 1253번 - 좋다 (0) | 2023.05.11 |
---|---|
[Python 파이썬]백준 1477번 - 휴게소 세우기 (2) | 2023.05.08 |
[Python 파이썬] 백준 17073번 - 나무 위의 빗물 (0) | 2023.05.04 |
[Python 파이썬] 백준 5430번 - AC (0) | 2023.05.04 |
[Python 파이썬] 백준 1316번 - 그룹 단체 체커 (0) | 2023.05.01 |