<aside> 💬 lv0, 행렬, 조건 검사

행렬 최댓값과 최솟값

문제 설명

M x N 크기의 정수 행렬이 주어집니다. 이 행렬에서 특정 범위에 해당하는 값들의 최대값과 최소값을 구하는 코드를 작성해주세요. 예를 들어, 범위가 '3 이상 7 이하인 값'이라면, 행렬에서 3 이상 7 이하인 값들 중 최대값과 최소값을 계산합니다.


제한 사항


입출력 예

입력 (행렬, 범위) 출력 (범위 내 요소의 최대값, 최소값)
([[1, 2, 3], [4, 5, 6], [7, 8, 9]], (3, 7)) (7, 3)
([[10, 21], [32, 45]], (20, 40)) (40, 21)

입출력 설명

각 행렬에서 주어진 범위에 해당하는 요소들을 찾아 그 중 최대값과 최소값을 반환합니다.

</aside>

😺 풀이 1. 행렬 탐색, 조건 검사

def solution(data): **#1 함수 정의**
    matrix, range_values = data **#2 데이터 분리**
    min_value, max_value = float("inf"), float("-inf") **#3 최솟값, 최댓값 초기화**
    lower_bound, upper_bound = range_values **#4 범위의 시작점, 종료점 정의**

    for row in matrix: **#5 행 탐색**
        for item in row: **#6 열 탐색** 
            if lower_bound <= item <= upper_bound: **#7 조건 검사**
                min_value = min(min_value, item) **#8 최솟값 갱신**
                max_value = max(max_value, item) **#9 최댓값 갱신**

    return (max_value, min_value) if min_value != float("inf") else (None, None) **#10 최댓값, 최솟값 반환**

단계별 풀이 전략

  1. 함수 정의

    코드의 첫 부분에서 solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. data는 조건을 만족하는 요소의 개수와 그 요소의 합을 찾을 대상이 되는 행렬과 범위입니다. 여기서 범위는 범위의 시작점과 범위의 종료점으로 이루어져 있습니다.

  2. 데이터 분리

    data의 행렬과 범위를 matrix, range_values로 언패킹합니다.

  3. 최솟값, 최댓값 초기화

    범위 내 요소의 최솟값 min_value에 초깃값으로 양의 무한대 float("inf")를 할당합니다. 범위 내 요소의 최댓값 max_value에 초깃값으로 음의 무한대 float("-inf")를 할당합니다.

  4. 범위의 시작점, 종료점 정의

    범위 range_values에서 범위의 시작점, 범위의 종료점을 lower_bound, upper_bound로 언패킹합니다.

  5. 행 탐색

    행렬 matrix에서 1차원 행 배열 row를 탐색합니다.

  6. 열 탐색

    탐색한 행 배열 row에서 열 데이터 item을 탐색합니다.

  7. 조건 검사

    if lower_bound <= item <= upper_bound:를 통해 탐색 숫자인 item이 범위 내에 존재하는지 검사합니다.

  8. 최솟값 갱신

    item이 조건에 만족하면 min 함수를 이용하여 최솟값 min_valueitem 중 가장 작은 값을 구합니다. 구한 가장 작은 값을 min_value에 할당하여 최솟값을 갱신합니다.

  9. 최댓값 갱신

    max 함수를 이용하여 최댓값 max_value를 갱신합니다.

  10. 최댓값, 최솟값 반환

    삼항 연산자를 이용하여 최솟값이 갱신이 되는 경우 최댓값, 최솟값으로 (max_value, min_value)를 반환하고, 최솟값이 갱신되지 않고 양의 무한대인 경우, (None, None)을 반환합니다.

알아둬야 할 개념

풀이 2. 평탄화