상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 17822번: 원판 돌리기 (삼성 A형 기출 문제)

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

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

본문

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

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀있고, i번째 원판에 적힌 j번째 수의 위치는 (i, j)로 표현한다. 수의 위치는 다음을 만족한다. (i, 1)은 (i, 2), (i, M)과 인접하다. (i, M)은 (i, M-1), (i, 1)과 인접하다. (i, j)는 (i, j-1), (i, j

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
61
62
63
64
65
66
67
def rotation(x, d, k):
    global N, M
    for i in range(N):
        if (i+1) % x == 0:
            if d == 0:
                for _ in range(k):
                    a = arr[i].pop(-1)
                    arr[i].insert(0, a)
 
            elif d == 1:
                for _ in range(k):
                    a = arr[i].pop(0)
                    arr[i].append(a)
 
    lst = []
    for i in range(N - 1):
        for j in range(M):
            if arr[i][j] == arr[i + 1][j] and arr[i][j] != 0:
                lst.append([i, j])
                lst.append([i + 1, j])
 
    for i in range(N):
        for j in range(M):
            if arr[i][j - 1== arr[i][j] and arr[i][j - 1!= 0:
                lst.append([i, j - 1])
                lst.append([i, j])
 
    if len(lst) == 0:
        cnt = 0
        tot = 0
        for i in range(N):
            for j in range(M):
                if arr[i][j] != 0:
                    tot += arr[i][j]
                    cnt += 1
 
        if cnt == 0:
            return
 
        avg = tot / cnt
        for i in range(N):
            for j in range(M):
                if arr[i][j] != 0:
                    if arr[i][j] > avg:
                        arr[i][j] -= 1
                    elif arr[i][j] < avg:
                        arr[i][j] += 1
    else:
        for co in lst:
            arr[co[0]][co[1]] = 0
 
 
N, M, T = map(int,input().split())
arr = []
for _ in range(N):
    arr.append(list(map(int,input().split())))
 
for _ in range(T):
    x, d, k = map(int,input().split())
    rotation(x, d, k)
 
result = 0
for i in range(N):
    result += sum(arr[i])
 
 
print(result)
 

Python3, 132ms

처음에는 한 원판 내에서 좌우 비교를 처음에만 하면 그 이후로는 할 필요가 없다고 생각했었는데 원판을 회전시킨 후 삭제한 수가 아예 없으면 발생하는 조건에 의해 좌우가 같아지는 경우가 발생한다는 것을 알고 함수를 수정하느라 시간이 더 들었다.(처음 문제를 읽을 때 문제를 완벽하게 이해하는 것이 얼마나 중요한 가를 새삼 또 깨닫는...) 또한 삭제한 수가 없을 때 평균을 구하는 과정에서 cnt = 0 인 경우 (회전해야 하는 명령은 남아있으나 일찍이 모든 수가 삭제된 경우)를 생각해주지 않아 첫 제출에서 런타임 에러가 발생하였다. 모든 샘플이 맞았지만 제출 시 오답 처리를 당하는 경우가 많은데 실제 시험에서는 이 같은 실수를 하지 않도록 연습을 해야 한다.

관련글 더보기

댓글 영역