본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 17140 이차원 배열과 연산

by Alan_Kim 2023. 6. 3.
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연산 모두 같은 방식이다. 그래서 함수를 하나만 만들고자 한다. cal_R
  • C연산을 사용해야할 때 (열의 개수가 행의 개수보다 많을 때)는 transform을 통해 행과 열을 바꾼다음 cal_R을 한 다음 다시 transform을 한다.
  • 연산 방식은 행마다 원소와 원소의 개수를 묶은 다음 원소의 개수가 작은 것, 원소의 크기 순으로 오름차순으로 나열 한다. (단 0은 제외)
  • 원소, 원소의 개수를 차례대로 리스트 안에 넣은 다음 추가적으로 필요한 만큼 0을 넣어준다.

CODE

def calR():
    global A
    new_graph = []
    for i in A:
        elem = set(i)
        tem = []
        tem2 = []
        for j in elem:
            if j == 0:continue
            cnt = i.count(j)
            tem.append((j, cnt))
        tem.sort(key=lambda x: (x[1], x[0]))
        for k in tem:
            tem2.append(k[0])
            tem2.append(k[1])
        tem2 = tem2[:100]
        new_graph.append(tem2)
    max_len = max(map(len, new_graph))
    for i in range(len(new_graph)):
        while len(new_graph[i]) != max_len:
            new_graph[i].append(0)
    A = new_graph


if __name__ == "__main__":
    r, c, k = map(int, input().split())
    A = [list(map(int, input().split())) for _ in range(3)]
    for i in range(101):
        try:
            if A[r - 1][c - 1] == k:
                print(i)
                break
        except:
            pass

        if len(A[0]) > len(A): # 열의 개수가 더 클 때
            A = list(map(list, zip(*A))) # transform
            calR()
            A = list(map(list, zip(*A)))
        else: # 행의 개수가 열의 개수 이상일 때
            calR()
    else:
        print(-1)
728x90
반응형

댓글