-
Notifications
You must be signed in to change notification settings - Fork 5
Leantosurf / 3월 1주차 / 7문제 #152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Mingguriguri
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
일주일 간 7문제를 푸시다니 대단하십니다! 저도 꾸준히 풀 수 있도록 본받도록 할게요...ㅎ
또 각 문제별로 문제, 알고리즘, 시간복잡도를 자세히 잘 정리하시는 것 같습니다!
여러모로 배워갑니당 고생하셨어요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 아래 코드처럼 매번 If 문 안에서 조회하게 짰는데 이렇게 코드 짜는 게 훨씬 효율적인 것 같네요!
plan = list(map(int, input().split()))
result = "YES"
for i in range(1, m):
if parent[plan[i]-1] != parent[plan[0]-1]:
result = "NO"
breakThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
문제 조건에 한번에 출력이라는 게 없다면 result 리스트가 아니라 바로바로 출력해도 좋을 것 같습니다!
if find(a) == find(b):
print("YES")
else:
print("NO")There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
혹시 26-27줄에 같은 랭크 부분은 왜 추가가 된 건지 알 수 있을까요?
저는 이 부분을 아래 코드처럼 작성하였습니다. 참고해주세요!
if p_a > p_b: # 값이 더 작은 쪽을 부모로 설정
parent[p_a] = p_b
else:
parent[p_b] = p_a
YoonYn9915
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pr에 유니온 파인드에 대한 개념과 여행가자 문제에 대해 잘 작성해 주셔서 이해하기 쉬웠습니다.
한 주 수고하셨습니다!
🌱WIL
🚀주간 목표 문제 수: 5개
백준 #1976. 여행가자: 유니온파인드 / 골드4
정리한 링크: 바로가기
🚩플로우 (선택)
문제시간복잡도알고리즘🚩제출한 코드
💡TIL
Find 연산: 특정 노드가 속한 집합의 대표 노드를 찾는 연산이다. (경로 압축 사용)
find(x):x가 속한 그룹의 대표 노드를 찾는다.Union 연산: 두 개의 노드를 같은 집합으로 합치는 연산이다.
union(x, y):x와y가 속한 집합을 합친다.root_x,root_y가 다르면root_y를root_x의 자식으로 설정한다.초기화:
parent[i]=i→ 처음에는 모든 노드가 자기 자신을 대표하는 집합이다.union(i, j)를 수행하여 같은 집합으로 묶는다. 이 과정이 끝나면 모든 연결된 도시들이 같은 그룹으로 묶인다.union(x,y)연산을 통해 같은 그룹으로 묶는다.find()를 사용한다.백준 #1717. 집합의 표현: 유니온파인드 / 골드4
정리한 링크: (바로가기)
🚩플로우 (선택)
🚩제출한 코드
💡TIL
백준 #1326. 폴짝폴짝: BFS/DFS / 실버2
정리한 링크: 바로가기
🚩플로우 (선택)
문제알고리즘개구리는 특정 위치($i$ )에서 배수(
arr[i])만큼 떨어진 곳으로 점프할 수 있다. 최소 점프 횟수를 찾는 문제이므로, 최단 거리 탐색 알고리즘이 필요하다.⇒ BFS(Breadth-First Search)
BFS vs. DFS
BFS에서는 큐(Queue)를 활용해 방문할 노드를 탐색하면서 최소 횟수를 기록한다.
시간복잡도queue를 활용하여 한 번 방문한 곳을 다시 방문하지 않도록 하면, 각 노드는 한 번씩만 방문하게 되어arr를 저장한다.queue를 생성하고, (현재 위치, 현재까지의 점프 횟수) 형태로 저장한다.visited배열을 생성한다.🚩제출한 코드
💡TIL
1회차queue에서pos,jump를 꺼낸다.pos==b라면jump를 반환한다. (최소 점프 횟수)arr[pos]의 배수만큼 이동 가능한 위치를 탐색한다.queue에 추가하고visited를 업데이트한다.2회차문제에서 점프의 방향을 제한하지 않았다. 좌측 방향으로 점프를 하는 케이스까지 고려해야 한다.
⇒ 문제에서 이동 방향이 조건으로 명시되어 있지 않다면 왼, 오 모두 이동할 수 있다.
BFS 알고리즘의 구현 방법을 익힐 수 있는 문제였다. 코드를 복잡하게 짠 것 같아 다른 풀이들과 비교해보면서 최적화된 코드를 확인하고 개념을 다시 복습해보면 좋을 것 같다.
문제를 풀기 전에 가능한 시간복잡도를 고려하고, 적절한 알고리즘을 선택하는 것이 아직은 익숙치 않다. 문제를 풀 때마다 생각해보면서 습관을 길러볼 것.
백준 #4963. 섬의 개수: BFS/DFS / 실버2
정리한 링크: 바로가기
🚩플로우 (선택)
문제시간복잡도알고리즘그래프 탐색 문제
한 지점에서 상하좌우, 대각선으로 인접한 곳으로 이동한다. 연결된 모든 지점을 이동한다.
⇒ 2차원 배열에서 상하좌우 또는 상하좌우, 대각선으로 이동하는 인접탐색을 진행한다면 BFS/DFS 떠올릴 것!
visited배열 없이 1→0으로 바꾸어 탐색을 처리 할 수 있다🚩제출한 코드
💡TIL
백준 #27737. 버섯 농장: BFS/DFS / 실버1
정리한 링크: 바로가기
🚩플로우 (선택)
문제$N$x$N$칸으로 이루어진 나무판이 있다. 각 칸은 0(버섯이 자랄 수 있다) 또는 1(버섯이 자랄 수 없다)로 이루어져 있다.
버섯 포자는 0칸에만 심을 수 있다.
각 버섯 포자는 포자가 심어진 칸을 포함해 최대$K$ 개의 연결된(=상하 좌우로 적어도 한 변을 공유하는) (버섯이 자랄 수 있는) 칸에 버섯을 자라게 하다.
버섯 포자를 하나라도 사용하고 버섯이 자랄 수 있는 모든 칸에 버섯이 자랐을 때 농사가 가능하다.
**농사가 가능할지 판단(POSSIBLE, IMPOSSIBLE)**하고, 농사가 가능하면 버섯 포자의 최소 개수를 구한다.
시간복잡도알고리즘(포자 개수) = [덩어리 크기/$K$]
🚩제출한 코드
💡TIL
백준 #10026. 적록색약: BFS/DFS / 골드5
정리한 링크: 바로가기
🚩플로우 (선택)
문제$N$x$N$ 크기의 그리드에서 R(빨강), G(초록), B(파랑) 중 하나로 색칠된 그림이 주어진다.
같은 색으로 상하좌우 인접한 칸들은 같은 구역으로 본다.
두 경우의 구역 개수를 구한다.
시간복잡도알고리즘🚩제출한 코드
💡TIL
적록색약의 탐색을 위해 그리드에서 G를 R로 변경하는 과정이 추가되는데, 이는 그리드를 한 번 순회하면서 수행되므로$O(N^2)$ 이다.
방향벡터를 사용해서 상하좌우 이동하는 코드 잘 기억해두어야 한다.
상하좌우 대각선의 경우 [2963. 섬의 개수](https://www.notion.so/2963-1ac81c5c2178800cad76d38605737228?pvs=21) 풀이 참고하기.
BFS에서 인접한 노드를
queue에 넣기 전에는 항상 두 조건을 확인한다.queue에 삽입한다.백준 #9195. 1,2,3 더하기: DP / 실버3
정리한 링크: 바로가기
🚩플로우 (선택)
문제시간복잡도알고리즘각 숫자(1, 2, 3)을 더하면서$n$ 을 만들 수 있는 모든 경우를 시도하면 약 $3^n$ 번의 연산이 필요하다. 최대 $n$ 이 11이므로 3^11≈177,147 연산이 필요하다. 1억 번 이하라 가능은 하지만, 더 좋은 방법이 있다.
규칙을 찾기 위해 작은 값부터 나열해본다.
DP[n] = DP[n−1]+DP[n−2]+DP[n−3]의 점화식을 도출할 수 있다.동적계획법(DP): 전 단계의 합을 활용해서 다음 단계의 답을 구할 수 있을 때 활용한다.
점화식이 성립되었으므로, 작은 값부터 차례대로 DP 배열을 채워나가면 된다.
점화식 정의:
DP[n] = DP[n−1]+DP[n−2]+DP[n−3]초기값 설정:
DP[1]=1,DP[2]=2,DP[3]=4DP 테이블 채우기: 점화식을 이용해 최대$n$ 까지 미리 계산해 둔다.
점화식대로$n$ 까지의 DP를 탐색하기 위해서는 **$O(N)$**의 시간복잡도가 소요된다.
🚩제출한 코드
💡TIL