상세 컨텐츠

본문 제목

[코드트리/INTERMEDIATE LOW] Simulation 1차원 바람 Python 파이썬

알고리즘/코드트리

by 감싹이 2023. 8. 7. 21:31

본문

🔥 문제 링크

https://www.codetree.ai/missions/2/problems/The-1D-wind-blows?utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

🔥 문제 

 

🔥 풀이

시뮬레이션 문제는 문제가 길어서 겁 먹게 된다,, 이 문제는 1차원 밀어내기 구현이라 어렵지 않았음

✅ 모듈화 연습하기 좋은 문제라고 생각함

     ✔️ 모듈화 잘해두면 실수를 금방 찾을 수 있음

 

메인 실행문

    ✔️ rn, drt 변수에 몇번째 행이 어떻게 바뀌는지 담는다

    ✔️ rn = row number / drt = direction

    ✔️ 재귀함수로 풀어야겠다고 로직을 짰기 때문에 visited 배열 들고 다님

    ✔️ 윗줄은 올라가면서 전파, 아랫줄은 내려가면서 전파되므로 서로 전파시키면 안 됨 => visited로 방지

n, m, q = map(int, input().split())

ground = [list(map(int, input().split())) for _ in range(n)]


for _ in range(q):
    rm, drt = input().split()
    rm = int(rm)-1
    visited = [False]*n

    change_row(rm, drt)

for i in range(n):
    for j in ground[i]:
        print(j, end=" ")
    print()

 

 모듈1 : check_direction

    ✔️ 이전 방향과 반대 방향으로 가야하므로 방향을 바꿔주는 기능

 

 모듈2 : check_difference

    ✔️기준 row와 비교 row가 같은 열에 같은 숫자를 가지고 있는지 비교

    ✔️ 같은 숫자를 가지고 있으면 cnt 증가

    ✔️ cnt가 1 이상이면 True 반환함 (전파 영향 받음)

 

 모듈3 : change_row

    ✔️ 방향에 밀어내기 진행하는 모듈

    ✔️ 다음 행이 전파에 영향을 받는지 안 받는지 판단하여 재귀함수 실행 => 완전탐색

 

 

 

🔥 코드

def check_direction(prev_direction):
    if prev_direction == "L":
        return "R"
    else:
        return "L"

def change_row(row, direction):
    
    visited[row] = True

    if direction == "L":
        temp1 = ground[row][m-1]

        for i in range(m-1, 0, -1):
            ground[row][i] = ground[row][i-1]
        
        ground[row][0] = temp1

    else:
        temp1 = ground[row][0]

        for i in range(m-1):
            ground[row][i] = ground[row][i+1]

        ground[row][m-1] = temp1
    
    if row-1 >= 0 and not visited[row-1] and check_diffrence(row, row-1):
        change_row(row-1, check_direction(direction))
    
    if row+1 < n and not visited[row+1] and check_diffrence(row, row+1):
        change_row(row+1, check_direction(direction))


def check_diffrence(row1, row2):
    cnt = 0
    for i in range(m):
        if ground[row1][i] == ground[row2][i]:
            cnt += 1
    
    if cnt == 0:
        return False

    return True
    

n, m, q = map(int, input().split())

ground = [list(map(int, input().split())) for _ in range(n)]


for _ in range(q):
    rm, drt = input().split()
    rm = int(rm)-1
    visited = [False]*n

    change_row(rm, drt)

for i in range(n):
    for j in ground[i]:
        print(j, end=" ")
    print()

관련글 더보기