오답노트 - AC
한달 전에 풀고 포스팅했던 기억이 나서, 쉽게 풀릴줄 알았는데 꽤 애를 먹었다. 이번에는 Delete때 마다, 배열의 앞, 뒤로 원소를 빼는 것이 아니라, 포인터 두개를 활용해 문제를 풀었다.
오답노트 - 내리막길
오늘의 문제 겸 오답노트로 내리막길을 다시 풀어보았다. 얼핏 기억이 나서 dp를 사용한 DFS로 문제를 풀었는데 자꾸 시간초과가 발생했다. 그러다가 또 못참고 이전에 내가 썻던 설명을 봐버렸다. 내일 한번 더 풀어봐야겠다.
지나간 길의 목록들을 달고다니면서 DFS를 수행한것이 시간복잡도가 증가한 원인이었다. 아래의 코드는 시행착오를 겪었던 코드이다.
풀었다!
CODE - 시간초과
import sys
read=sys.stdin.readline
m,n=map(int,read().split())
MAP=list(list(map(int,read().split())) for _ in range(m))
dp=list(list(-1 for _ in range(n)) for _ in range(m))
dp[-1][-1]=1
dx=[1,0,0,-1]
dy=[0,1,-1,0]
def dfs(save):
a,b=save[-1][0],save[-1][1]
for x,y in zip(dx,dy):
ax,by=a+x,b+y
if 0<=ax<m and 0<=by<n and MAP[ax][by]<MAP[a][b]:
if dp[ax][by]==-1:
dfs(save+[[ax,by]])
else:
for i,j in save:
if dp[i][j]==-1:
dp[i][j]+=(dp[ax][by]+1)
else: dp[i][j]+=dp[ax][by]
dfs([[0,0]])
print(dp[0][0])
ABCDE
BFS로 풀지 DFS로 풀지 헷갈렸던 문제다.
BFS로도 풀 수는 있는 것 같았으나 결국 DFS로 해서 풀었다.
CODE
import sys
read=sys.stdin.readline
n,m=map(int,read().split())
friends=dict()
for _ in range(m):
a,b=map(int,read().split())
if a in friends:
friends[a].append(b)
else: friends[a]=[b]
if b in friends:
friends[b].append(a)
else: friends[b]=[a]
check=list(0 for _ in range(n))
cnt=0
#cnt를 사용하지 않고, check배열의 1의 개수로
#문제의 조건을 판단하면 시간초과가 발생했다.
def dfs(x):
global cnt
check[x]=1
cnt+=1
if cnt==5:#깊이가 5 >> ABCDE를 만족하는 친구들이 존재한다는 뜻이다.
print(1)
sys.exit()
for i in friends[x]:
if check[i]==0:
dfs(i)
cnt-=1
check[x]=0
for i in range(n):
dfs(i)
#종료되지 않고 여기까지 넘어오면 ABCDE를 만족하는 친구들이 존재하지 않는다는 뜻이다.
print(0)
CODE
풀어야 할 문제
- 스타트 택시
- 미네랄
- 회전 초밥
- 아기 상어
- 꼬인 전깃줄, 전깃줄 -2