[Baekjoon] 17140번: 이차원 배열과 연산(구현 Gold4) - Python

꼬마요리사레미·2023년 8월 8일

Algorithm

목록 보기
38/41

1. 문제

이차원 배열과 연산

2. 풀이

from collections import Counter

def r_operation(input_list):
    output_list = []
  
    for row in input_list:
        element_count = Counter(row)
        sorted_items = sorted(element_count.items(), key=lambda x: (x[1], x[0]))
        row_result = []  
        for number, count in sorted_items:
            if number != 0:
                row_result.append(number)
                row_result.append(count)
        
        output_list.append(row_result) 

    max_length = max(len(row) for row in output_list) 
    
    for row in output_list:
       row.extend([0] * (max_length - len(row)))
          
    return output_list

def c_operation(input_list):
    transposed_list = []
  
    for j in range(len(input_list[0])):
        column_data = [row[j] for row in input_list]
        transposed_list.append(column_data)

    transposed_list = r_operation(transposed_list)

    output_list = []
  
    for j in range(len(transposed_list[0])):
        row_result = [row[j] for row in transposed_list]
        output_list.append(row_result)
    
    return output_list


r, c, k = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(3)]

time = 0

while True:
  if r-1 < len(A) and c-1 < len(A[0]) and A[r-1][c-1] == k: 
      break
      
  if time > 100: 
    time = -1
    break
    
  if len(A) >= len(A[0]):
      A = r_operation(A)
  else:
      A = c_operation(A)
    
  time += 1
  
print(time)

3. 로직

  1. 배열 A에서 (r, c) 위치에 있는 값이 k와 같아지는 것을 목표로 한다.
  2. 최대 100번까지 R 연산 혹은 C 연산을 수행하며 목표 값을 찾아나갈 수 있다.
  • r_operation: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용된다.
  • c_operation: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용된다.
  1. 목표 값을 찾은 경우엔 while 문을 탈출해서 걸린 시간을 출력한다. 만약 100초가 지난 후에도 목표 값을 찾지 못했을 경우 -1을 출력한다.

r_operation 함수

  1. output_list를 초기화한다.
  2. 입력 리스트 input_list의 각 행에 대해서 다음 과정을 수행한다.
  • Counter(row)를 사용하여 각 숫자가 해당 행에 몇 번 등장하는지 카운트한다.
  • element_count.items()를 사용하여 숫자와 해당 숫자의 등장 횟수를 (숫자, 횟수) 형태의 튜플로 변환한 리스트를 생성한다.
  • sorted() 함수를 사용하여 위에서 생성한 리스트를 정렬한다. 정렬의 기준은 먼저 숫자의 등장 횟수를 오름차순으로, 그 다음 숫자 값 자체를 오름차순으로 정렬한다.
  • 정렬된 튜플 리스트 sorted_items를 순회하면서 각 숫자와 횟수를 확인한다.
    • 만약 숫자가 0이 아니면, row_result 리스트에 숫자와 횟수를 번갈아 추가한다.
    • output_list에 row_result를 추가하여 각 행에 대한 결과를 저장한다.
  1. 최대 길이를 계산하기 위해 max_length 변수에 output_list의 각 행의 길이 중 최대 값을 저장한다.
  2. output_list의 각 행에 대해서 다음 과정을 수행한다.
  • 행의 길이가 max_length보다 작으면, while 루프를 사용하여 행의 끝에 0을 추가하여 길이를 max_length로 맞춘다.
  1. 최종적으로, output_list를 반환한다.

c_operation 함수

  1. transposed_list를 초기화한다. 이 리스트는 배열 input_list의 열을 행으로 변환한 결과를 저장할 곳이다.
  2. 배열 input_list의 첫 번째 행의 길이를 기준으로 열의 개수만큼 반복하면서 다음 과정을 수행한다.
  • column_data 변수에 각 열의 데이터를 저장한다.
  • transposed_list에 column_data를 추가하여 열 데이터를 행으로 변환하여 저장한다.
  1. 변환된 transposed_list를 r_operation 함수를 사용하여 재구성한다.
  2. output_list를 초기화한다. 이 리스트는 최종 결과를 저장할 곳이다.
  3. transposed_list의 첫 번째 행의 길이를 기준으로 행의 개수만큼 반복하면서 다음 과정을 수행한다.
  • row_result 변수에 열을 다시 행으로 변환하여 저장한다. 각 열에 위치한 원소들을 행으로 변환한 리스트이다.
  • 변환된 row_result를 output_list에 추가하여 최종 결과를 저장한다.
  1. 최종적으로, output_list를 반환한다.

0개의 댓글