diff --git a/05--search/han/baekjoon/13023.py b/05--search/han/baekjoon/13023.py index 293c634..2d0d7cb 100644 --- a/05--search/han/baekjoon/13023.py +++ b/05--search/han/baekjoon/13023.py @@ -19,13 +19,13 @@ def dfs(index, depth): for i in tree[index]: if visited[i] == 0: dfs(i, depth + 1) - visited[index] = 0 + visited[index] = 0 # 이 부분이 핵심. 끝까지 파고 들어가서 만약에 def solve(): for _ in range(M): a, b = map(int, input().split()) - tree[a].append(b) + tree[a].append(b) # 양방향 설정 tree[b].append(a) depth = 1 @@ -46,7 +46,8 @@ def solve(): # 문제 이해 # 특정 조건에 트리가 매칭되는 지 확인? -# dfs를 이용하는 것 같긴 한데, 어떤 의미인지 모르겠음 왜 예저 2가 통과하는거지? 0 -> 3 -> 2 -> 1 -> 4 +# dfs를 이용하는 것 같긴 한데, 어떤 의미인지 모르겠음 +# 왜 예제 2가 통과하는거지? 0 -> 3 -> 2 -> 1 -> 4 아마 이 경우 # 양쪽으로 연결되어있고 그리고 visited[index] = 0 이 핵심인듯 # 제한 조건 diff --git a/08--graph/empty.txt b/08--graph/empty.txt deleted file mode 100644 index 8b13789..0000000 --- a/08--graph/empty.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/08--graph/han/baekjoon/1167.py b/08--graph/han/baekjoon/1167.py new file mode 100644 index 0000000..ddb3c35 --- /dev/null +++ b/08--graph/han/baekjoon/1167.py @@ -0,0 +1,68 @@ +from collections import deque +import sys + +input = sys.stdin.readline + + +def bfs(v, visited, A, distance): + q = deque() + q.append(v) + visited[v] = True + + while q: + node = q.popleft() + for e, v in A[node]: + if not visited[e]: + visited[e] = True + q.append(e) + distance[e] = distance[node] + v + + +def solve(): + N = int(input()) + A = [[] for _ in range(N + 1)] + distance = [0] * (N + 1) + visited = [False] * (N + 1) + + for _ in range(N): + # 1 3 2 -1 + d = list(map(int, input().split())) + i = 0 + S = d[i] # 1, i = 0 + i += 1 # i = 1 + while True: + E = d[i] # 3, i = 1 + if E == -1: + # 제약조건 -1이면 연결된 노드가 없다는 뜻. 더 이상 연결노드 추가하지 않아도됨. + break + V = d[i + 1] # 2, i = 1 + A[S].append((E, V)) # tuple 형태로 연결된 노드 추가 + i += 2 # i = 3 + + bfs(1, visited, A, distance) + + temp = 1 + + for i in range(2, N + 1): + if distance[temp] < distance[i]: + temp = i + + distance = [0] * (N + 1) + visited = [False] * (N + 1) + bfs(temp, visited, A, distance) + distance.sort() + print(distance[N]) + + +if __name__ == '__main__': + solve() + +# 문제 이해 +# 입력 312 -> 3 노드 - 2 - 1 노드 +# 노드는 튜플로 선언 왜? 어떤 노드가 얼마나 거리가 먼 엣지와 연결되어있는지 알기 위해선 +# 최대 거리를 측정할 배열과, 방문을 확인할 배열이 필요할듯. +# 어렵다, 더 이상 어떻게 풀어나가야할지 모르겠음. -> 답안 확인 + +# 제약사항 +# 노드 갯수는 2 이상 +# 입력된 수중에 -1이면 연결된 노드가 없다는 뜻. diff --git a/08--graph/han/baekjoon/18352.py b/08--graph/han/baekjoon/18352.py new file mode 100644 index 0000000..04aa2b2 --- /dev/null +++ b/08--graph/han/baekjoon/18352.py @@ -0,0 +1,51 @@ +from collections import deque +import sys + +input = sys.stdin.readline + +def bfs(v, visited, A): + q = deque() + q.append(v) + visited[v] += 1 + + while q: + node = q.popleft() + for i in A[node]: + if visited[i] == -1: + visited[i] = visited[node] + 1 + q.append(i) + +def solve(): + N, M, K, X = map(int, input().split()) + A = [[] for _ in range(N + 1)] # 도시의 연결을 나타내기 위한 배열, 도시는 1부터 시작하니 크기는 N + 1 만큼 + result = [] + visited = [-1] * (N + 1) # 방문 했는 지 확인 + + for _ in range(M): + S, E = map(int, input().split()) + A[S].append(E) + + # X 출발 도시 번호 + bfs(X, visited, A) + + for i in range(N + 1): + if visited[i] == K: + result.append(i) + + if not result: + print(-1) + else: + result.sort() + for i in result: + print(i) + + +if __name__ == '__main__': + solve() + +# 문제 이해 +# 단방향으로만 이동할 수 있음. +# 최단거리 문제, K가 주어짐. 정확히 K랑 같은 거리인 노드만 찾으면 됨. +# 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X +# BFS이용하면 될 것 같은데.. 잘 안됨 -> 답안 참고 + diff --git a/08--graph/han/baekjoon/README.md b/08--graph/han/baekjoon/README.md new file mode 100644 index 0000000..069acc5 --- /dev/null +++ b/08--graph/han/baekjoon/README.md @@ -0,0 +1,7 @@ +# 정리 +- 반복이 필요하다. 유형에 익숙해져야할듯. + + +## 다시 풀기 +- [ ] +- [ ] \ No newline at end of file diff --git a/README.md b/README.md index 4c3db76..06eb1d4 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,15 @@ # lets-algorithm ## 기간 -- 2023년 1월 9일 ~ 4월 7일 +- 2025년 8월 20일 ~ 11월 20일 -## 사이클 -### 1월 -- 9일 ~ 27일 -> 자료구조 - -### 2월 -- 1월 28일 ~ 10일 -> 정렬 -- 2월 11일 ~ 24일 -> 탐색 (총 6문제 필수, 나머지는 optional) -- 2월 25일 ~ 3월 9일 -> 탐색(복습), 그리드(6문제) -- 3월 10일 ~ 3월 24일 -> 정수론 (소수구하기 037, 1문제 선택), (041, 042, 043, 045) -- 3월 25일 ~ 4월 7일 -> 실전편) 그래프 4문제 + 탐색(못푼문제들, 25,28,31) +## 방법 +- 특정 범위 설정하고, 시간 내 풀고 공유 (optional) + - 범위는 나눠서 풀고, + - 괜찮은 문제들 공유하고, rough 하게 공유 -## 규칙 -- 1사이클은 2주 -- 1사이클에 1개의 챕터 목표 -- 사이클이 끝나는 주 금요일 오후 8시 반에 구글 밋으로 온라인 공유 - - 공유 예시 - - 어려웠던 문제, 새롭게 배운 python 문법등, 추가적으로 푼 문제가 있다면 공유 - - 다음 사이클에 바라는 점 (회고) - - 해당 미팅은 가능한 30분 이내에 마무리 - - **위 내용을 PR에도 기재** -- 해당 사이클 내 챕터를 끝내지 못하거나 사정이 생길 경우, 회고 전 공유 -- PR 생성의 경우 **사이클이 끝나는 주 목요일** 까지를 목표로 하되, 최대한 금요일 회고 전까지는 생성. -- PR 리뷰가 마무리 되었을 경우, 리뷰어가 해당 PR을 머지함. -- 회고 전까지 생성된 PR이 머지가 안되었을 경우, PR 생성자가 직접 머지할 수 있음. -- 회고는 솔직하고, 서로 도움이 되는 방향으로. +## 사이클 +- 2주 단위 ## 구성 - `/ds` (챕터) @@ -40,14 +22,6 @@ - 최대 30분 고민 후 문제 풀기 (문제 이해, 정리, 코드 작성) - 이 이상 소요된다면 교재 혹은 답안 보고 품. -## 진행방식 -- 브랜치는 생성 (e.g `han`, `ds-han`) -- 해당 브랜치에 commit (문제 푼 흔적) -- 문제를 모두 풀고 PR 생성 및 리뷰어 할당(e.g han -> main) -- 리뷰어는 상대방이 문제 푼 방식 혹은 PR 내용(e.g 어려웠던 문제등을 정리해논 내용) 을 확인하고 코멘트(optional)를 남길 수 있음. -- 코멘트가 다 처리되었거나, 코멘트 내용이 없다면 리뷰어가 해당 PR을 머지. -- 추가적으로 공유하고싶은 내용은 회고시간에 공유 - ## 참고 -- -- +- https://neetcode.io/practice?tab=blind75 +- https://product.kyobobook.co.kr/detail/S000001932748