본문 바로가기
문제 풀이/백준(BOJ)

[Python] 백준 17140번 : 이차원 배열과 연산

by 희조당 2023. 3. 8.
728x90

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

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net


💡 문제 풀이

구현 문제이다.

 

R 연산과 C 연산은 대상만 다를 뿐 똑같은 로직을 가진다.

따라서, 배열의 열과 행을 바꿔줌으로 추가적인 로직 구현을 할 필요가 없다.

연산을 하다 보면 처음 크기보다 작아져서 오류가 뜨는 경우가 있다. 

예외처리를 통해서 그런 경우는 넘어가도록 하게 해야 한다.

✔️ 느낀 점

zip() 함수를 사용하면 정말 2차원 배열을 쉽게 뒤집을 수 있다.

이번 문제를 풀면서 생각보다 시간복잡도에 대한 이해가 부족하다는 생각이 들었다.

좀 더 시간복잡도를 생각하면서 문제를 풀어야겠다.

💻 코드

import sys ; input = sys.stdin.readline
from collections import Counter

def rFun():
    maxSize = 0
    for r in range(len(board)):
        s = sorted(Counter(board[r]).most_common(), key=lambda x:(x[1], x[0]))
        tmp = []
        for num, cnt in s:
            if num == 0: continue
            tmp.append(num)
            tmp.append(cnt)
        board[r] = tmp
        maxSize = max(maxSize, len(tmp))
    
    for r in range(len(board)):
        board[r] += [0 for _ in range(maxSize - len(board[r]))]
        board[r] = board[r][:100]

def cFun():
    global board
    board = list(zip(*board))
    rFun()
    board = list(zip(*board))

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

for i in range(101):
    try:
        if board[r-1][c-1] == k:
            print(i)
            break
    except: pass
    if len(board) >= len(board[0]): rFun()
    else: cFun()
else: print(-1)

댓글