상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 17140번: 이차원 배열과 연산 (삼성 A형 기출 문제)

Python/문제풀이 (삼성 A형 대비)

by 코딩하는 낙타 2020. 2. 7. 10:40

본문

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

 

내 풀이:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def counting(lst):
    table = [0* 101
    for i in lst:
        table[i] += 1
    table[0= 0
    table2 = table[:]
    table2.sort()
    result = []
    for i in table2:
        if i == 0:
            pass
        else:
            result.append((table.index(i), i))
            table[table.index(i)] = 0
    return result
 
 
def go():
    global max_col
    for rows in arr:
        next_row = []
        count_table = counting(rows)
        for num, cnt in count_table:
            if num == 0:
                continue
            next_row.append(num)
            next_row.append(cnt)
        max_col = max(max_col, len(next_row))
        next_arr.append(next_row)
 
    for rows in next_arr:
        if len(rows) < max_col:
            for _ in range(max_col - len(rows)):
                rows.append(0)
 
r, c, k = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(3)]
time = 0
 
while time <= 100:
    if r <= len(arr) and c <= len(arr[0]) and arr[r-1][c-1== k:
        print(time)
        break
 
    time += 1
    max_col = 0
    next_arr = []
 
    if len(arr) >= len(arr[0]):
        go()
        arr = next_arr
 
    elif len(arr) < len(arr[0]):
        arr = list(map(list, zip(*arr)))
        go()
        arr = next_arr
        arr = list(map(list, zip(*arr)))
 
if time == 101:
    print(-1)
 
 

Python3, 96ms

이번 문제는 정답률이나 난이도에 비해 나를 많이 힘들게 한 문제이다. 배열을 어떻게 처리해주어야 하는가에 대한 아이디어를 떠올리기가 너무 힘들었기 때문이다. R 연산의 경우는 처리가 어렵지 않았지만 C 연산의 경우 배열의 세로 방향으로 처리를 해줘야 한다는 것이 머릿 속으로 코딩 방향을 잡기가 쉽지 않았다. 결과적으로는 2차원 배열의 행과 열을 바꿔주는 방법으로 결정하였다. 이 행위를 위해서 쓸 수 있는 방법은 검색을 통해 알아냈는데 파이썬의 경우 map()과 zip(), 언패킹을 이용하면 쉽게 할 수 있다는 것이다. arr = list(map(list, zip(*arr))), 2차원 배열 arr에서 zip 함수을 이용하여 같은 자리에 있는 성분들을 가져와 묶어주고 이를 다시 list로 만든 다음 list에 저장하여 2차원 배열을 다시 구성하는 방식이다. 또한 나는 counting 함수를 정의하여 문제의 조건을 만족시켰는데 이 또한 Counter를 import하여 쉽게 해결하는 방법이 있었다. 모듈을 사용하지 않고 문제를 해결하자는 주의였으나 A 시험에서 sys 이외의 모듈은 호출하여 사용 가능한 것을 생각하면 정말 유용한 모듈의 경우에는 기억해 두었다가 공부하면 좋을 것 같다.

관련글 더보기

댓글 영역