오답노트 - 피사노 주기

0,1이 연속으로 다시 등장할때, 주기가 다시 반복된다는 것을 이용해 쉽게 풀었다.

CODE

import sys
read=sys.stdin.readline

n = int(read())
for _ in range(n):
    i,t=map(int,read().split())

    a,b=1,1
    cnt=2
    while True:
        a,b=b,(a+b)%t
        cnt+=1
        if a==1 and b==0: break
    print(i,cnt)


치즈 -2636

CODE

import sys
read=sys.stdin.readline
from collections import deque

h,w=map(int,read().split())
ch=list(list(map(int,read().split())) for _ in range(h))

dx=[1,0,0,-1]
dy=[0,1,-1,0]

point=deque([[0,0]])
outsideair=[]#치즈를 감싸는 공기 저장

while point:
    a,b=point.popleft()
    for x,y in zip(dx,dy):
        ax,by=a+x,b+y
        if 0<=ax<h and 0<=by<w and ch[ax][by]==0:
            point.append([ax,by])
            ch[ax][by]='*'
            #리스트를 프린트했을 때 사각형이 깨지지 않도록 하기위해 -1이 아닌 *로 변환했다.
            outsideair.append([ax,by])

time=0#치즈가 사라질때 까지 걸린 시간
disappear_tmp=0#이전 회차에서 사라진 치즈의 개수 저장
disappear=0#이번 회차에서 사라질 치즈의 개수

while True:
    disappear_tmp=disappear
    disappear=0
    outsideair_tmp=[]#치즈가 없어져 새로운 외부공기가 될 칸들을 저장

    #outsideair에 둘러쌓인 없어질 치즈들 탐색
    for a,b in outsideair:
        for x,y in zip(dx,dy):
            ax,by=a+x,b+y
            if 0<=ax<h and 0<=by<w and ch[ax][by]==1 and [ax,by] not in outsideair_tmp:
                outsideair_tmp.append([ax,by])
                disappear+=1

    tmp=[]
    #outsideair에 둘러쌓여 없어질 치즈들을 탐색한 후
    #치즈들이 녹고 나서 내부 공기가 외부 공기와 만날 수도 있기 때문에, 이런 공기들을 다시한번 탐색해 tmp에 저장한 후 outsideair_tmp에 추가해준다.
    for a,b in outsideair_tmp:
        ch[a][b]='*'
        point=deque([[a,b]])
        while point:
            a,b=point.popleft()
            for x,y in zip(dx,dy):
                ax,by=a+x,b+y
                #녹은 치즈들과 인접한 공기가 존재하면 이 공기들도 '*'로 변환
                if 0<=ax<h and 0<=by<w and ch[ax][by]==0:
                    point.append([ax,by])
                    ch[ax][by]='*'
                    tmp.append([ax,by])

    outsideair_tmp+=tmp
    outsideair=outsideair_tmp[::]
    #녹은 치즈가 없다면 while문 탈출!
    if outsideair==[]:
        print(time)
        print(disappear_tmp)
        break

    time+=1


치즈 -2638

CODE

import sys
# sys.stdin = open("input.txt","rt")
read=sys.stdin.readline
from collections import deque
n,m=map(int,read().split())
ch=list(list(map(int,read().split())) for _ in range(n))

dx=[1,0,0,-1]
dy=[0,1,-1,0]

outside=[]
def getOutside_air():
    point=deque([[0,0]])
    while point:
        a,b=point.popleft()
        for x,y in zip(dx,dy):
            ax,by=a+x,b+y
            if 0<=ax<n and 0<=by<m and ch[ax][by]==0:
                ch[ax][by]='*'
                point.append([ax,by])
                for xx,yy in zip(dx,dy):
                    axx,byy=ax+xx,by+yy
                    if 0<=axx<n and 0<=byy<m and ch[axx][byy]==1 and [ax,by] not in outside:
                        outside.append([ax,by])
                        break
    return

getOutside_air()
answer=0
while True:
    tmp_melt=[]
    tmp_melt_two=[]
    tmp_outside=[]

    for a,b in outside:
        for x,y in zip(dx,dy):
            ax,by=a+x,b+y
            if 0<=ax<n and 0<=by<m and ch[ax][by]==1:
                if [ax,by] not in tmp_melt: tmp_melt.append([ax,by])
                else: tmp_melt_two.append([ax,by])

    for a,b in tmp_melt_two:
        ch[a][b]='*'
        for x,y in zip(dx,dy):
            ax,by=a+x,b+y
            if 0<=ax<n and 0<=by<m and ch[ax][by]==0:
                point=deque([[ax,by]])
                while point:
                    i,j=point.popleft()
                    for xx,yy in zip(dx,dy):
                        ixx,jyy=i+xx,j+yy
                        if 0<=ixx<n and 0<=jyy<m and ch[ixx][jyy]==0:
                            ch[ixx][jyy]='*'
                            tmp_outside.append([ixx,jyy])
                            point.append([ixx,jyy])
                break
    tmp_outside+=tmp_melt_two

    if tmp_outside==[]:break
    outside+=tmp_outside
    answer+=1

    # for i in ch:
    #     print(*i)
    # print()

print(answer)


풀어야 할 문제

  • 스타트 택시
  • 미네랄
  • 회전 초밥
  • 아기 상어
  • 전깃줄 -2