삼성 SW 역량 테스트 기출 문제

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



Solution

from copy import deepcopy
def turn(wp, idx, d, k):
if d == 0:
for _ in range(k):
t = wp[idx][-1]
wp[idx] = [t] + wp[idx][:m-1]
else:
for _ in range(k):
wp[idx].append(wp[idx].pop(0))
def check(wp):
checked = [[False] * m for _ in range(n)]
for i in range(n):
tmp = wp[i][0]
if tmp == wp[i][1] and tmp:
checked[i][0], checked[i][1] = True, True
elif tmp == wp[i][m-1] and tmp:
checked[i][0], checked[i][m-1] = True, True
tmp = wp[i][m-1]
if tmp == wp[i][m-2] and tmp:
checked[i][m-1], checked[i][m-2] = True, True
elif tmp == wp[i][0] and tmp:
checked[i][m-1], checked[i][0] = True, True
for j in range(2, m-1):
tmp = wp[i][j]
if tmp == wp[i][j-1] and tmp:
checked[i][j] = True
checked[i][j-1] = True
elif tmp == wp[i][j+1] and tmp:
checked[i][j] = True
checked[i][j+1] = True
for j in range(m):
if wp[0][j] == wp[1][j] and wp[0][j]:
checked[0][j] = True
checked[1][j] = True
if wp[n-1][j] == wp[n-2][j] and wp[n-1][j]:
checked[n-1][j] = True
checked[n-2][j] = True
for i in range(2, n-1):
tmp = wp[i][j]
if tmp == wp[i-1][j] and tmp:
checked[i][j] = True
checked[i-1][j] = True
elif tmp == wp[i+1][j] and tmp:
checked[i][j] = True
checked[i+1][j] = True
flag = 0
for i in range(n):
for j in range(m):
if checked[i][j] == True:
wp[i][j] = 0
flag += 1
cnt = 0
s = 0
if flag == 0:
for i in range(n):
for j in range(m):
if wp[i][j] != 0:
cnt += 1
s += wp[i][j]
avg = s/cnt
for i in range(n):
for j in range(m):
if wp[i][j] != 0:
if wp[i][j] < avg:
wp[i][j] += 1
elif wp[i][j] > avg:
wp[i][j] -= 1
n, m, t = map(int, input().split(' '))
wp = [list(map(int, input().split(' '))) for _ in range(n)]
data = [list(map(int, input().split(' '))) for _ in range(t)]
for i in data:
x, d, k = i[0], i[1], i[2]
for j in range(n):
if (j+1) % x == 0:
turn(wp, j, d, k)
else:
continue
s = 0
for i in wp:
s += sum(i)
if s == 0:
break
else:
check(wp)
ans = 0
for i in wp:
ans += sum(i)
print(ans)

문제 유형 : 시뮬레이션

 

 

삼성 기출 문제는 코드도 길어지게 되고 어렵다,,

 


생강강

,