파이썬 알고리즘 262번 | [백준 14891번] 톱니바퀴

Yunny.Log ·2022년 9월 4일
0

Algorithm

목록 보기
267/318
post-thumbnail

262. 톱니바퀴

1) 어떤 전략(알고리즘)으로 해결?

구현
시뮬레이션

2) 코딩 설명

<내 풀이>


from collections import deque
import sys

톱니 = []
for _ in range(4) :
    lis = list(sys.stdin.readline().strip())
    lis = (map(int,lis))
    톱니.append(deque(lis))

def clock(deq) :
    deq.appendleft(deq.pop())

def counter_clock(deq) :
    deq.append(deq.popleft())

def check_주변(num,dir,visit) : 
    if 0<=num-1<4 and visit[num-1]==0:
        if 톱니[num-1][2] != 톱니[num][6] :
            visit[num-1]=1
            #방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향
            if dir==-1 :
                # 나는 반대 방향으로 돔
                check_주변(num-1, 1, visit)
                clock(톱니[num-1])
                
            else : 
                check_주변(num-1, -1, visit) # 체크 먼저 해주고 그 다음에 바퀴 돌려야한다! 
                counter_clock(톱니[num-1])
                

    if 0<=num+1<4  and visit[num+1]==0:
        if 톱니[num+1][6] != 톱니[num][2] :
            visit[num+1]=1
            if dir==-1 :
                # 나는 반대 방향으로 돔
                
                check_주변(num+1, 1, visit)
                clock(톱니[num+1])
                
            else : 
                check_주변(num+1, -1, visit)
                counter_clock(톱니[num+1])
                

k = int(sys.stdin.readline())

for i in range(k) :

    num, dir = map(int, sys.stdin.readline().split())
    visit = [0 for _ in range(4)]
    visit[num-1] = 1
    check_주변(num-1, dir,  visit )
    if dir==-1 :
        counter_clock(톱니[num-1])
    else : 
        clock(톱니[num-1])
    # print(톱니)

res = 0
if 톱니[0][0] == 1 : res+=1
if 톱니[1][0] == 1 : res+=2
if 톱니[2][0] == 1 : res+=4
if 톱니[3][0] == 1 : res+=8
print(res)

< 내 틀렸던 풀이, 문제점>


from collections import deque
import sys

톱니 = []
for _ in range(4) :
    lis = list(sys.stdin.readline().strip())
    lis = (map(int,lis))
    톱니.append(deque(lis))

def clock(deq) :
    deq.appendleft(deq.pop())

def counter_clock(deq) :
    deq.append(deq.popleft())

def check_주변(num,dir, origin_num) : 
    if 0<=num-1<4 and num-1 !=origin_num:
        if 톱니[num-1][2] != 톱니[num][6] :
            #방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향
            if dir==-1 :
                # 나는 반대 방향으로 돔
                clock(톱니[num-1])
                check_주변(num-1, 1, origin_num)
            else : 
                counter_clock(톱니[num-1])
                check_주변(num-1, -1, origin_num)

    if 0<=num+1<4  and num+1 !=origin_num:
        if 톱니[num+1][6] != 톱니[num][2] :
            if dir==-1 :
                # 나는 반대 방향으로 돔
                clock(톱니[num+1])
                check_주변(num+1, 1, origin_num)
            else : 
                counter_clock(톱니[num+1])
                check_주변(num+1, -1, origin_num)

k = int(sys.stdin.readline())

for i in range(k) :
    num, dir = map(int, sys.stdin.readline().split())
    check_주변(num-1, dir, num-1)
    if dir==-1 :
        counter_clock(톱니[num-1])
    else : 
        clock(톱니[num-1])
    
# print(톱니)
res = 0
if 톱니[0][0] == 1 : res+=1
if 톱니[1][0] == 1 : res+=2
if 톱니[2][0] == 1 : res+=4
if 톱니[3][0] == 1 : res+=8
print(res)

  • check 주변하는 부분에서 톱니바퀴를 돌리기 전에 검사해야하는데 돌려논 후에 검사하고 있어서 틀려주는 것이었음,

  • 이것 순서 변경하면 되긴 하는데, 변경만하면 무한 에러가 나서 visit 로 이미 주변체크한 것은 가지 말아야 함

0개의 댓글