[코드트리 파이썬] 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

전체 시뮬레이션 함수이다.

먼저 시작 배열을 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()