diff --git "a/Hongjoo/\353\260\261\354\244\200/\354\204\254\354\235\230\352\260\234\354\210\230.py" "b/Hongjoo/\353\260\261\354\244\200/\354\204\254\354\235\230\352\260\234\354\210\230.py" new file mode 100644 index 00000000..7861f6d8 --- /dev/null +++ "b/Hongjoo/\353\260\261\354\244\200/\354\204\254\354\235\230\352\260\234\354\210\230.py" @@ -0,0 +1,68 @@ +""" +https://www.acmicpc.net/problem/4963 +# 유형 : 그래프 탐색 (DFS/BFS) +- goal) 지도 속 섬 군집 개수 구하기 +- 각 섬은 가로,세로,대각선 연결 가능 +- 땅은 1, 바다는 0 +- 지도 밖은 바다 0 +- 입력은 다중 테스트 케이스 -> grid [W,h] => 출력 : 각 테스트 케이스별로 섬의 개수 출력 + +#flow +1) 지도 2배열 입력 받기 +2) 방문 등록 여부 확인 = 섬 군집 개수 반환 by dfs + 1 = 방문 x 땅, -1 방문한 땅 , 0 바다 +2-1) dfs +""" +# 1. 각 테스트 케이스 분리 +# 입력 0,0 전까지 계속 입력 받기 +import sys +from collections import deque +input = sys.stdin.readline +# 상하좌우 + 대각선 4개 = 8방위 이동 +dy = [-1, 1, 0,0 , -1,-1,1,1] +dx = [0,0,-1,1 , -1,1,-1,1] + + +while True : + W,H = map(int, input().split()) + # 입력 종료 조건 + if W == 0 and H == 0 : + break + # 지도 입력 받기 + field = [ [0 for _ in range(W)] for k in range(H)] + for i in range(H) : + field[i] =list(map(int, input().split())) + # 군집 탐색 + def bfs (s_y,s_x): + q = deque() + q.append([s_y,s_x]) + field[s_y][s_x] = -1 # -1 방문 등록 + while q : + c_y, c_x = q.popleft() + for i in range(8): + n_y , n_x = c_y + dy[i] , c_x + dx[i] + # 지도 내부 범위 확인 + if 0<= n_y < H and 0<= n_x < W : + # 방문 등록 안한 곳 + 바다 아닌 섬임 + + if field[n_y][n_x] > 0 : + q.append([n_y , n_x]) + field[n_y][n_x] = -1 + + cnt = 0 + for i in range(H): + for j in range(W): + if field[i][j] > 0 : + bfs(i, j) + # print(f"@{cnt}") + # print(f"{field}") + cnt+=1 + + print(f"{cnt}") + + + + + + + diff --git "a/Hongjoo/\353\260\261\354\244\200/\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" "b/Hongjoo/\353\260\261\354\244\200/\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" new file mode 100644 index 00000000..66e5a61e --- /dev/null +++ "b/Hongjoo/\353\260\261\354\244\200/\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" @@ -0,0 +1,25 @@ +""" +https://www.acmicpc.net/problem/10844 +""" +n = int(input()) +# dp [총 길이 i ][마지막 자리수가 j] = 인 개수 +Mod = 1000000000 +# 1. 초기화 +#(1) 0을 시작하는 수는 계단수가 아닌다 - dp[1][0] +# (2) N=1 인 계단수 +dp = [[0]*10 for _ in range(n+1)] +dp[1][0] = 0 +for j in range(1,10): + dp[1][j]= 1 + +# (3) 점화식 N>=2 +for i in range(2,n+1): + for j in range(10): + if j== 0 : + dp[i][j] = dp[i-1][j+1] + elif j==9: + dp[i][j] = dp[i-1][j-1] + else : + dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] + +print(sum(dp[n])%Mod) \ No newline at end of file diff --git "a/_WeeklyChallenges/W16-[DP]/Assignment_BOJ_1562_\352\263\204\353\213\250\354\210\230.py" "b/_WeeklyChallenges/W16-[DP]/Assignment_BOJ_1562_\352\263\204\353\213\250\354\210\230.py" new file mode 100644 index 00000000..30d3e7c9 --- /dev/null +++ "b/_WeeklyChallenges/W16-[DP]/Assignment_BOJ_1562_\352\263\204\353\213\250\354\210\230.py" @@ -0,0 +1,34 @@ +''' +BOJ #1562. 계단수 (골드 1) +https://www.acmicpc.net/problem/1562 +유형: 비트마스킹, DP +''' + +N = int(input()) +MOD = 1_000_000_000 +BIT = 1 << 10 + +dp = [[[0] * BIT for _ in range(10)] for _ in range(N)] + +for j in range(1, 10): + dp[0][j][1 << j] = 1 + +for i in range(1, N): + for j in range(10): + for bit in range(BIT): + nxt_bit = bit | 1 << j + + if 0 < j: + dp[i][j][nxt_bit] += dp[i - 1][j - 1][bit] + + if j < 9: + dp[i][j][nxt_bit] += dp[i - 1][j + 1][bit] + + dp[i][j][nxt_bit] %= MOD + +cnt = 0 +for j in range(10): + cnt += dp[N - 1][j][BIT - 1] + cnt %= MOD + +print(cnt) \ No newline at end of file diff --git a/_WeeklyChallenges/W16-[DP]/README.md b/_WeeklyChallenges/W16-[DP]/README.md new file mode 100644 index 00000000..55ede299 --- /dev/null +++ b/_WeeklyChallenges/W16-[DP]/README.md @@ -0,0 +1,16 @@ +## 🚀4월 1주차 (4/07) 스터디 발제 주제: DP +> 발제자: 김홍주 + +> 주제: DP +### 🗂️ 스터디 자료 +- PDF: [바로가기 +](./Study_BOJ_10844.pdf) + +### 📖 문제 +- [백준 #10844. 쉬운계단수](https://www.acmicpc.net/problem/10844): DP / 실버1 +- 정답 코드: [Study_BOJ_2293_10844_쉬운계단수.py](./Study_BOJ_10844_쉬운계단수.py) + + +### 💻 과제 +- [백준 #1562. 계단수](https://www.acmicpc.net/problem/1562): 비트마스킹,DP / 골드 1 +- 정답 코드: [Assignment_BOJ_1562_계단수.py](./Assignment_BOJ_1562_계단수.py) diff --git a/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844.pdf b/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844.pdf new file mode 100644 index 00000000..43e2fda2 Binary files /dev/null and b/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844.pdf differ diff --git "a/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844_\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" "b/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844_\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" new file mode 100644 index 00000000..8b2c8aa4 --- /dev/null +++ "b/_WeeklyChallenges/W16-[DP]/Study_BOJ_10844_\354\211\254\354\232\264\352\263\204\353\213\250\354\210\230.py" @@ -0,0 +1,27 @@ +''' +BOJ #10844. 쉬운 계단수 (실버1) +https://www.acmicpc.net/problem/10844 +유형: DP +''' + +n = int(input()) + +Mod = 1000000000 +# 1. 초기화 +# dp [총 길이 i ][마지막 자리수가 j] = 인 개수 +dp = [[0]*10 for _ in range(n+1)] +dp[1][0] = 0 +for j in range(1,10): + dp[1][j]= 1 + +# 2 점화식 N>=2 +for i in range(2,n+1): + for j in range(10): + if j== 0 : + dp[i][j] = dp[i-1][j+1] + elif j==9: + dp[i][j] = dp[i-1][j-1] + else : + dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] + +print(sum(dp[n])%Mod) \ No newline at end of file