코딩테스트/codetree

[코드트리 조별과제] 5주차 학습

견우직녀달 2024. 8. 13. 00:15

최근에 다시 알고리즘 공부를 하기 시작했습니다.

 

친구과 함께 하루에 백준에서 골드2문제를 랜덤으로 뽑아서 진행을 하고, 남은 시간에는 코드트리의 커리큘럼에 따라서 문제를 풀이하고 정리하려고 합니다. 

 


[코드트리] Intermediate Low / BFS / BFS탐색

 

문제는 단순하게 n * m 이차원 영역이 주어지고, 해당 영역에는 뱀이 서식합니다.

이 뱀들은 움직이지 않으며, 저희는 (0, 0) 지역에서 (n-1, m-1) 지역까지 이동할 수 있는지 판단내리면 됩니다.

 

[입력 범위]

2 <= n, m <= 100

[예제 입력 1]

5 5
1 0 1 1 1
1 0 1 0 1
1 0 1 1 1
1 0 1 0 1
1 1 1 0 1

[출력 1]

1

 

[정답 코드]

더보기
from collections import deque

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

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

visited=[[0]* m for _ in range(n)]

visited[0][0] = 1
q = deque([[0,0]])
while q:
    x,y = q.popleft()
    for dx,dy in (0,1),(0,-1),(1,0),(-1,0):
        nx,ny = x + dx, y+dy
        if nx < 0 or nx >=n or ny < 0 or ny >=m:continue
        if not board[nx][ny] or visited[nx][ny]:continue
        visited[nx][ny] = 1
        q.append((nx,ny))
print(visited[n-1][m-1])

visited 배열을 0으로 초기화하고 bfs 돌린 후 배열을 출력하기만 하면 됩니다.

 

[코드트리] Intermediate Low / DP / 아이템을 적절히 고르는 문제

 

M원을 거슬러 줘야 할 때 N개 종류의 동전들로만 M원을 만드시오.

 

이 때 동전의 개수는 최소가 되도록 만드는 문제.

 

[입력 범위]

1 <= N <= 100, 1<= M <= 10, 000 

 

[예제 입력 1]

3 8
1 4 5

[출력 1]

2

 

[정답 코드]

더보기
n , m = map(int,input().split())
li = [*map(int,input().split())]

li.sort()

dp = [10001] * (m+1)
dp[0] = 0

for num in li:
    for i in range(num,m+1):
        dp[i] = min(dp[i], dp[i-num]+1)
result = dp[m]
print([result, -1][result == 10001])

 

마지막에 M값을 받아서 저런식으로 출력하는 것은 자주 사용되는 테크닉이다.

 

저렇게 하는 이유는 값이 값을 채울 수 없다면 -1을 출력해야 되는 문제이기에 저런식으로

 

dp의 값이 초기화되지 않은 점을 이용하는 풀이이다.