문제
풀이
두 방향을 동시에 처리하려면 코드가 매우 복잡해질 수 있기 때문에 한 방향을 우선적으로 처리하는 방법을 적용하였다.
def shift(row, currDir):
if currDir == shiftRight:
building[row].insert(1, building[row].pop())
else:
building[row].insert(m, building[row].pop(1))
먼저 배열을 밀어주는 함수이다.
현재 방향에 따라 배열을 미는 역할을한다.
def isSameNumber(row1, row2):
return any([
building[row1][col] == building[row2][col]
for col in range(1, m + 1)
])
이동하는 방향의 배열과 같은 값이 있어야 전이되기 때문에 같은값이 있는지 확인해주는 함수이다.
def flip(currDir):
return shiftRight if currDir == shiftLeft else shiftLeft
현재 방향을 바꿔주는 함수이다.
def simulate(startRow, startDir):
shift(startRow, startDir)
startDir = flip(startDir)
currDir = startDir
for row in range(startRow, 1, -1):
if isSameNumber(row, row - 1):
shift(row - 1, currDir)
currDir = flip(currDir)
else:
break
currDir = startDir
for row in range(startRow, n):
if isSameNumber(row, row + 1):
shift(row + 1, currDir)
currDir = flip(currDir)
else:
break
전체 시뮬레이션 함수이다.
먼저 시작 배열을 shift해준다.
이 후 바람의 방향을 바꿔준다.
다음으로 위로 이동하면서 전이를 시작한다.
이동하는 row에 현재 row와 같은 값이 있다면 shift함수를 사용해서 shift를 진행한다.
그 뒤 아래로 전이를 시작하는데 방법은 위와 동일하다.
for _ in range(q):
r, d = tuple(input().split())
r = int(r)
simulate(r, shiftRight if d == 'L' else shiftLeft)
for row in range(1, n + 1):
for col in range(1, m + 1):
print(building[row][col], end = " ")
print()
마지막으로 값을 입력받아 시뮬레이션을 진행한다.
코드
shiftRight = 0
shiftLeft = 1
n, m, q = map(int, input().split())
building = [
[0 for _ in range(m + 1)]
for _ in range(n + 1)
]
def shift(row, currDir):
if currDir == shiftRight:
building[row].insert(1, building[row].pop())
else:
building[row].insert(m, building[row].pop(1))
def isSameNumber(row1, row2):
return any([
building[row1][col] == building[row2][col]
for col in range(1, m + 1)
])
def flip(currDir):
return shiftRight if currDir == shiftLeft else shiftLeft
def simulate(startRow, startDir):
shift(startRow, startDir)
startDir = flip(startDir)
currDir = startDir
for row in range(startRow, 1, -1):
if isSameNumber(row, row - 1):
shift(row - 1, currDir)
currDir = flip(currDir)
else:
break
currDir = startDir
for row in range(startRow, n):
if isSameNumber(row, row + 1):
shift(row + 1, currDir)
currDir = flip(currDir)
else:
break
for row in range(1, n + 1):
givenNumber = list(map(int, input().split()))
for col, num in enumerate(givenNumber, start = 1):
building[row][col] = num
for _ in range(q):
r, d = tuple(input().split())
r = int(r)
simulate(r, shiftRight if d == 'L' else shiftLeft)
for row in range(1, n + 1):
for col in range(1, m + 1):
print(building[row][col], end = " ")
print()
'알고리즘' 카테고리의 다른 글
[코드트리 파이썬] 회의실 겹치지 않게 하기 (0) | 2024.03.07 |
---|---|
[코드트리 파이썬] 강력한 폭발 (0) | 2024.03.04 |
[코드트리 파이썬] 금 채굴하기 (0) | 2024.02.29 |
[백준 파이썬] 1068 트리 (0) | 2024.02.26 |
[백준 파이썬] 1068 트리 (1) | 2024.02.25 |