Algorithm/릿코드

99클럽 코테 스터디 28일차 2500. Delete Greatest Value in Each Row

Albosa2lol 2024. 6. 27. 04:26

https://leetcode.com/problems/delete-greatest-value-in-each-row/description/

 

양의 정수로 구성된 m×n 크기의 행렬 grid가 주어집니다.

 

grid가 빈 행렬이 될 때까지 다음 작업을 수행합니다:

  1. 각 행에서 가장 큰 값을 삭제합니다. 여러 개의 동일한 최댓값이 존재하는 경우, 그 중 아무거나 삭제합니다.
  2. 삭제된 값들 중 가장 큰 값을 정답에 더합니다.
  3. 이 작업을 반복할 때마다 열의 수가 하나씩 감소합니다.

위의 작업을 모두 수행한 후의 정답을 반환하세요.

 

 

 

 

 

 

풀이

 

1. grid가 빈 행렬이 될 때까지 작업을 반복

2. 각 while 문에서

  • 각 행의 가장 큰 값을 삭제하고, 이 값들을 저장
  • 저장된 값들 중 가장 큰 값을 answer에 추가

3. 최종적으로 누적된 answer 값을 반환

 

class Solution:
    def deleteGreatestValue(self, grid: List[List[int]]) -> int:
		# answer 변수 0 으로 설정
        answer = 0
    
    	# while 은 gird 가 비어있지 않고, 첫 번째 행에 요소가 남을때까지 반복
        while grid and grid[0]:
            # 1 각 행의 가장 큰 값을 삭제하고, 이 값들을 저장
            # 삭제된 값 저장 리스트 초기화 - 각 행에서 최대 값을 삭제한 후 이 값을 저장할 리스트를 빈 리스트로 초기화함
            # 각 반복마다 초기화시킨다
            deleted_values = []
            for row in grid:
            	현재 행의 최대값 찾기
                max_val = max(row)
                #찾은 최댓값 삭제
                row.remove(max_val)
                #삭제한 최댓값 deleted_values에 저장
                deleted_values.append(max_val)
            
            # 2: 저장된 값들 중 가장 큰 값을 answer에 추가
            answer += max(deleted_values)
        
        return answer

 

 

2차원 배열에서 for 구문을 쓰면 각 리스트(즉, 각 행)을 하나 씩 가져온다는 사실을 잊지말자.

 

추가) while 문법

 

루프 시작 조건: grid가 비어 있지 않고 (grid가 하나 이상의 행을 가지고 있어야 함), 첫 번째 행 (grid[0])이 비어 있지 않은 동안 계속 반복한다. 즉, grid에 삭제할 값이 남아 있는지 확인

    while grid and grid[0]:

 

 

  • grid가 비어 있지 않다.
  • grid의 첫 번째 행 (grid[0])이 비어 있지 않다.

while grid:

  • 이 조건은 grid가 비어 있지 않음을 확인한다.
  • grid가 리스트(혹은 다른 순차형 자료형)인 경우, 리스트가 비어 있으면 False로, 비어 있지 않으면 True가 반환됨
  • 예를 들어, grid가 [] (빈 리스트)라면, while grid:는 False가 되어 루프가 종료

while grid[0]:

  • 이 조건은 grid의 첫 번째 행([0] 이므로)이 비어 있지 않음을 확인한다
  • grid가 2차원 리스트이므로, grid[0]은 grid의 첫 번째 행(리스트)을 나타낸다
  • grid[0]이 비어 있지 않으면 True로, 비어 있으면 False 반환
  • 예를 들어, grid[0]이 [] (빈 리스트)라면, while grid[0]:는 False가 되어 루프가 종료

 

 

결론 : grid가 비어 있지 않고 (grid가 하나 이상의 행을 가지고 있어야 함), 첫 번째 행 (grid[0])이 비어 있지 않은 동안 계속 반복한다. 이는 grid에 삭제할 값이 남아 있을 때까지 루프가 실행됨을 의미한다.