묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨코딩테스트 [ ALL IN ONE ]
스택으로 DFS 구현하는 방법
안녕하세요. 지금 그래프 이론 파트를 보고 있는데요! 혹시 DFS를 스택으로 구현하는 거랑 델타 탐색에 대한 부분도 강의에 있는지 궁금합니다이론 파트 먼저 보고 문제 푼 후에 풀이 영상 보려고 남겨뒀는데 혹시 문제 풀이 쪽에서 설명을 해주시면 미리 보고 정리해두고 싶어서요
-
해결됨코딩테스트 [ ALL IN ONE ]
트리 구현 방식에 대한 질문
안녕하세요.트리를 클래스로 구현하는 것과 배열로 구현하는 것에 차이가 있나요? 이제 막 코딩테스트를 처음 공부하고 있는데 구현 방법에 따라서 활용도가 어떻게 다른지 궁금합니다.제가 짧게 혼자 공부햇을 때에는 배열로 트리를 만들고 인덱스를 기준으로 부모와 자식을 찾아가는 방식으로 공부했는데요.강사님 강의를 들어보니 클래스로 구현하는게 훨씬 직관적으로 보여서요.이런 구현 방식들이 각각 어떻게 장단점이 있는지 궁금합니다.제가 정리하기로는 배열은 완전 이진 트리만 구현이 가능하고 부모와 자식을 찾아가기에 용이하다... 클래스 형식으로 트리를 구현하면 루트부터 시작할 때 용이하다...라고 정리를 햇는데 잘 이해하고 있는 건가요?배열로 트리를 구현하게 되면 bfs랑 dfs 탐색을 할 때에도 인덱스를 타고 타고 넘어가도록 코드를 작성하면 되나요?그리고 용어들이 조금 헷갈리는데 연결리스트로 트리를 구현하는 방식이 클래스로 구현하는 것과 같은 의미인가요..?
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
이모스 관련 질문
안녕하세요. 선생님!백준 17611번 코드를 아래와 같이 작성했는데, 계속 고쳐봐도 "틀렸습니다"만 돌아와서 질문 남깁니다...코드가 너무 더러워서 최대한 주석을 달아봤는데.. 이해하시는 데 도움이 됐으면 하는 마음입니다 ㅠㅜfrom collections import defaultdict import sys input = sys.stdin.readline # input n = int(input()) arr = [] min_x, min_y = sys.maxsize, sys.maxsize dicH, dicV = defaultdict(list), defaultdict(list) for _ in range(n): x, y = map(int, input().split()) # 꼭지점 입력 dicH[x].append(y) # 수평으로 선분을 위치한다고 생각하고 그래프를 시계방향으로 90도 돌렸을 때 높이마다 존재하는 선분의 양 꼭지점을 모아둔 리스트 dicV[y].append(x) # 수직으로 선분을 위치한다고 했을 때, 높이마다 존재하는 선분의 양 꼭지점을 모아둔 리스트 min_x, min_y = min(min_x, x), min(min_y, y) # 높이마다 꼭지점을 정렬 for key in dicH: dicH[key] = sorted(dicH[key]) for key in dicV: dicV[key] = sorted(dicV[key]) # 누적합을 할 리스트 생성 prefixX, prefixY = [0 for _ in range(1_000_001)], [0 for _ in range(1_000_001)] # 이모스 적용 for key in dicH: length = len(dicH[key]) # 각 높이마다 꼭지점의 개수를 구하고 temp = 0 while temp < length - 1: # 꼭지점을 두 개씩 짝지어 1과 -1 추가 prefixY[dicH[key][temp] - min_y] += 1 # 누적합 리스트에 값을 올바른 위치에 추가하기 위해 min_y를 빼 시작점이 0이 되도록 함 prefixY[dicH[key][temp + 1] - min_y] -= 1 temp += 2 # 완료하면 두 칸 이동 for i in range(1, 1_000_001): prefixY[i] += prefixY[i - 1] for key in dicV: length = len(dicV[key]) temp = 0 while temp < length - 1: prefixX[dicV[key][temp] - min_x] += 1 prefixX[dicV[key][temp + 1] - min_x] -= 1 temp += 2 for i in range(1, 1_000_001): prefixX[i] += prefixX[i - 1] h = max(prefixY) v = max(prefixX) print(max(h, v))
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
BSP트리를 활용한 렌더링 순서 관련 질문
안녕하세요, 강사님. BSP트리를 활용한 렌더링 순서에 대해서 설명해주시는 부분에 있어서 궁금한 점이 있어 여쭈어보고자 합니다. 다음 예시에서 플레이어가 평면 F로 분할된 공간의 양의 공간에 있을 때, 음의 공간의 폴리곤부터 먼저 렌더링을 해야한다고 설명해주셨습니다(10:13~). 그런데 단순하게 생각하면 플레이어 입장에서 보여지는 부분부터 순서대로 렌더링 되어야 하는 것이 아닌가 하는 생각이 들었습니다. 예를 들어 F앞면 - A1 - B - C1 / G앞면 - A2 - D1 / H앞면 - D4 - C2 / D3 와 같은 순서처럼 말입니다. 렌더링 순서는 사실 크게 중요하지 않은 것인지, 그게 아니라면 해당 예시와 같이 플레이어 입장에서는 보이지 않는 영역인 음의 공간의 폴리곤부터 먼저 렌더링하는 이유(성능적인 부분)가 특별히 있는 것인지 궁금합니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
제약조건으로 시간 복잡도를 구하는 방법..
안녕하세요. 코테 제약조건으로 시간 복잡도 계산하는 부분을 듣고 있는데요.10^4에 n^2을 넣으면 10^8이 된다고 하셨는데 제가 예체능 수포자여서 이 계산 방법이 잘 이해가 안됩니다. ㅠㅋ용어가 맞는지 모르겠지만... BigO로 표기했을 때의 시간 복잡도의 지수와 제한 사항으로 주어진 지수끼리의 곱이 시간 초과 때문에 8이 넘으면 안된다고 이해하면 되는건가요? 이렇게 구하는 게 맞는지...그리고 제약 조건에서 n을 구할 때 연산자 사이에 있는 조건이 n이 되는 것이고 그 n이 1이 되는지, n^2이 되는지에 따라 시간 복잡도를 따지는 건가요?시간 복잡도를 중첩 반복문으로 계산하는 정도만 공부를 해서 잘 이해가 안됩니다. ㅠㅠ
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
쿼드트리 삽입 프로그램 실행 예시 질문
안녕하세요, 강사님. 5강 코드트리의 구현 강좌 초반부에서 삽입 예시를 설명해주신 부분에서 의아한 부분이 있어 여쭈어보고자 합니다. 첫 번째 삽입 예시의 Depth를 설명해주실 때, Depth를 4라고 말씀해주셨는데, 5가 아닌가 생각이 들었습니다.이후 세 번째 삽입 예시의 Depth를 설명해주실 때, 첫 번째 삽입 예시보다 한 단계 작게 삽입이 이루어지는 예시일 때도 Depth를 4라고 말씀하셔서, 어느 부분이 맞는 것인지 궁금합니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
강의 교재 부탁드려요
안녕하세요. 강의 너무 잘 보고 있습니다.교재 공유 요청 했는데 확인 한번 부탁드리겠습니다~!구글폼에 접수한 메일에는 아무것도 안와있어서요.
-
미해결Do it! 알고리즘 코딩테스트 with C++
백준 13023 질문있습니다.
문제의 의도가 파악이 되지 않아 질문 남깁니다.모든 노드에서 DFS를 돌리는경우도 유튜브 채널 댓글 보면서 이해를 했습니다.위의 설명을 보니 이해가 바로 되었습니다.근데 문제에서 A는 B와 친구다.B는 C와 친구다.C는 D와 친구다.D는 E와 친구다.라는 것을 보고 깊이가 4일 때를 하드코딩으로 코드에 넣으셨는데 저는 이것을 보고 그냥 DFS로 n -1번까지 다 연결되어 있으면 1을 출력하라는 것이구나~ 하고 이해를 하였는데 어디에 근거하여 깊이가 4인 경우가 발생하면 1을 출력하라고 어떻게 이해하셨는지 궁금합니다. #include <iostream> #include <vector> #include <queue> #include <algorithm> #include <deque> #include <cmath> using namespace std; #define ll long long #define endl "\n" int n; bool flag = false; vector<vector<int>> adj; vector<bool> visit; void DFS(int now, int depth) { visit[now] = true; if (depth == n - 1) { flag = true; return; } for (int next : adj[now]) { if (visit[next] == false) DFS(next, depth + 1); } visit[now] = false; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int m; cin >> n >> m; adj.resize(n); visit.resize(n); for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } for (int i = 0; i < n; ++i) { DFS(i, 0); if (flag) break; } if (flag == false) cout << 0; else cout << 1; return 0; }위는 제가 처음에 짠 틀린 코드입니다. DFS의 조건문에서 depth가 n - 1과 같으면 flag를통해 return하도록 하였습니다.
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
알고리즘 확인(?) 질문
아직 아리까리해서 확인 질문드립니다 ㅜㅜ... 강의 예시 부분에서 주황색영역(AABB체크할 영역)에 포함되는 노드를 찾아 검사대상에 올리는데요. 깊이3 쿼드트리 노드 85개 전체를 돌면서 주황생영역이 포함된 노드를 찾게 되는 것일까요? 그런다음 검사대상인 노드만 돌면서 노드에 등록된 물체에 대해 AABB충돌체크를 진행 하게 되는걸까요?
-
해결됨독하게 C를 배운 사람을 위한 선형 자료구조
이중 연결 리스트 AddNewNode 함수 질문
안녕하세요! 항상 좋은 강의 만들어주셔서 감사합니다! 강의 완강 후 복습하며 자료구조 구현 중에 질문이 있습니다. 이중 연결 리스트 구현 중 새로운 노드를 추가한 뒤, 앞뒤 노드의 pPrev와 pNext를 바꿔주는 과정에서 처음에는 pPrevNode를 새로 정의하지 않고 주석 처리한 부분으로 앞 노드와 관계를 정리했는데, 이렇게 하니 이전 노드의 pNext의 값이 pNewNode의 주소로 제대로 바뀌지 않는 것 같았습니다. 혹시 이렇게 되는 이유가 궁금합니다
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
우선순위큐로 구현시
최적화전 코드에 openSet에 이미 전에 계산한 중복노드가 있다면 낮은값일때 값을 바꿔주는 부분이 있었는데요. 우선순위큐에서 pop을하면 어차피 최소값을 보장하닌까 우선순위큐로 교체해준다면 굳이 바꿔줄 필요가 없겠지요?
-
미해결실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
인터뷰 예제에 관한 질문입니다.
ex1을 풀기 위해서 코딩을 했는데 어디가 틀렸는지 잘 모르겠습니다 ㅠㅠx를 input으로 받고 만약에 x가 int면 나눴을 때 나머지가 0이면 fizz 출력 0이 아니면 그대로 x 출력하고 int가 아니라면 not integer를 출력하고 싶습니다 x = input()if type(x) == int: if x % 3 == 0: print("fizz") else: print(x)else: print("not integer") 어디가 틀렸는지 알려주시면 감사하겠습니다.
-
미해결그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
터미널로 실행시키니깐 오류가 뜨네요
해결방법이 궁금합니다!
-
미해결Do it! 알고리즘 코딩테스트 with C++
문제 8번 질문드립니
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int N; cin >> N; vector<int> save(N + 1 , 0); for (int i = 1; i <= N; i++) { cin >> save[i]; } sort(save.begin(), save.end()); int result = 0; for (int k = 1; k <= N; k++) { int s = 1; int e = N; while (s < e && s >= 1 && e <= N) { int temp = save[s] + save[e]; if (temp < save[k]) { s++; } else if (temp > save[k]) { e--; } else { //만약 s와 e가 k와 같아지면 안됨 if (s != k && e != k) { result++; break; } else if (s == k) s++; else if (e == k) e--; } } } cout << result << "\n";} 제가 다음과 같이 돌렸을 때 틀렸습니다라고 나오는데, 벡터에 저장할 때 0부터 저장하면 정답이라고 나오는 이유를 모르겠습니다
-
미해결이득우의 꼭 배워야하는 게임 알고리즘
19:35 리스트와 이진힙의 구조비교
리스트의 경우 메모리가 분산 될수 있고 이진힙은 고정된 배열을 사용할수 있기 때문에 알고리즘에서 파악할수 없는 캐시 효과를 부과적으로 누릴수 있다. 이부분에대해 추가적인 설명을 해주실 수 있을까요?? 잘 이해가 가지 않습니다...
-
해결됨독하게 C를 배운 사람을 위한 선형 자료구조
pTmp 변수를 사용하는 이유
노드를 추가하는 함수나 해제하는 함수에서 헤드노드를 pTmp변수에 대입한 후에 pTmp값을 가지고 코드를 짜는 게 이유가 있나요? 그냥 pTmp를 사용하지 않고 바로 헤드노드를 사용해도 괜찮지 않나요?
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
알고리즘 수업 - 깊이 우선 탐색 2( 백준 24480) 번 질문
강의 제목 : 알고리즘 수업 - 깊이 우선 탐색 2( 백준 24480) 번 질문 안녕하세요! 위 강의 10:14번에 나와있는 정리 노트 관련해서 하나 여쭤보고 싶은 것이 있어요! 5번 '방문 순서를 담기 위해서는 어떤 자료구조를 사용해야 될까?' 이거 답이 리스트(LIST) 인가요?? 혹시 이 정리 노트에 있는 질문 5개에 대한 답변이 적혀있는 PDF 같은 게 있을까요??나중에 자격증 공부할 때 도움될 것 같아서 여쭤봅니다 감사합니다! 강의 영상마다 질문이 있으면 언제든 그리고 바로 질문 남겨주세요! 질문할 때 가장 정확하게 이해할 수 있습니다.해당 영상과 관련된 질문들을 해주실 때 제가 가장 정확히 답변 드릴 수 있습니다!취업 전반의 상담이나, "제 코드가 왜 틀렸는지 알려주세요"와 같이 광범위한 질문은, 질문자의 상황에 따라 답변이 달라질 수 있기 때문에, 정확한 답변을 드리기가 어렵습니다 :(이런 분들을 위해서는 멘토링 항목으로 별도 제공하고 있으니, 다음 링크를 참고해주세요!이 링크를 통해서는 본인의 코드가 왜 틀렸는지 모를 때 질문을 주셔도 좋고, 취업 전반(면접 준비, 자소서, CS 면접 등)에 관련한 질문을 주시면 답변 드리겠습니다 :)"이 질문은 해도 되나?"라는 생각이 드신다면 우선 남겨주세요! 제가 답변 드리기 어려운 건 멘토링에 올려 달라고 재요청 드리겠습니다 :)
-
해결됨코딩테스트 [ ALL IN ONE ]
강의 교재 공유 부탁드립니다~
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강사님 강의 너무 잘 보고 있습니다.교재 공유 요청 했는데 확인 한번 부탁드리겠습니다~!
-
해결됨코딩테스트 [ ALL IN ONE ]
Daily temperatures 시간 복잡도 질문
안녕하세요 강사님, Daily temperatures 문제 시간 복잡도에 의문이 생겨서 질문 드립니다. 강의에서 말씀해주신 코드가 아래와 같은데요def daily_temperatures(temperatures): ans = [0] * len(temperatures) stack = [] for day, temp in enumerate(temperatures): while stack and stack[-1][1] < temp: prev_day = stack.pop()[0] ans[prev_day] = day - prev_day stack.append((day, temp)) return ans첫번째 for 부분에서 시간 복잡도가 O(n)이고,두번째 while문이 왜 시간복잡도가 O(1)인지 좀 헷갈립니다.list의 pop의 시간복잡도가 O(1)이긴 한데, 이것도 n번 반복하면 O(n)이지 않나요?while문에서 최대한 pop이 일어날수 있는 수가 n번 ? 같아서 질문 드립니다. 감사합니다.
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
[활용(바텀업DP)] 추가질문 10:34
안녕하십니까 코딩센세님!잘 와닿지 않는 부분이 있어서 3일 정도 곱씹어보다가, 제가 생각한 바가 맞는지 검토가 필요해서 추가로 질문을 작성해봅니다. =====================================[활용 (바텀업DP)] 강의에서 10:34초 쯤에,냅색 문제의 탑다운DP 코드 일부분을 가리키며 이렇게 말씀하십니다. "이 재귀함수는 뒤에서부터 채워주는 형태죠?"Q1. 여기서, 뒤에서 채워준다는게 dp의 값을 idx==N부터 0을 리턴하며 dp[idx]에 값이 채워지기 때문이라고 이해하면 맞을까요?Q1-1. 위의 질문을 다르게도 표현하자면, 탑다운DP 방식으로 접근했기 때문에 엣지에서 시작하므로 끝에서부터 채워진다고 볼 수 있기 때문일가요?Q1-3. Q1.에서 이해한 바가 맞다면, 그와 같은 논리를 바탕으로, [활용 (바텀업 DP)] 강의 10:26초에서 설명하신 다음 코드에서 idx 부분을 빼줘야 하는 이유를 이해했지만,weight에서 item만큼의 무게를 빼줘야 하는 이유가 아직까지 이해가 되 지 않습니다..dp[idx][weight] = max(dp[idx - 1][weight - items[idx][0]] + items[idx][1], dp[idx-1][weight]===================================== [활용 (바텀업DP)] 강의에서 07:22~07:39초인덱스를 초과한 경우에 대한 연산을 설명하시는데요.Q2. if idx + interview[idx][0] > N:dp[idx] = dp[idx+1]위 코드를 가리키시며, "인덱스가 넘는 경우는 그냥 뒤에걸, 선택 안하는거를 추가해준다고 하고.." 라고 설명하셨습니다. 저는 이게 어떤 부분을 의도하시는건지 와닿지가 않았습니다.바텀업 dp는 코드를 따라가며 종이에 dp테이블을 적어보려 노력해봐도, 이해를 다 못해서 그런지 그려지지가 않더라구요.dp테이블 그리면서 생각을 추적하는 방법을 곁들여서 설명을 또 한번 부탁드려도 될지요?Q2-1. dp 인덱싱 부분을 제 입맛대로 조금 조작을 해봤는데요. 무슨 이유 때문에 아래의 코드는 90%에서 오류가 나는지 분석이 어렵습니다. 제가 첨부한 코드를 예시로 사용해서 설명을 Q2.에 대한 설명을 비교해주시면 감사드리겠습니다!# 바텀업DP 풀이 # 물건의 수, 배낭의 무게 # 4, 7 N, B = map(int, input().split()) # col_idx: 0, 1 # row_idx: 0, 1~3 # [idx][0]: Weight, [idx][1]: Value items = [list(map(int, input().split())) for _ in range(N)] # bag_wigth(col_idx): 0, 1~7 # item_idx(row_idx): 0, 1~3 dp = [[0 for _ in range(B+1)] for _ in range(N)] # idx: 0~3 # bag_weight: 0~7 for idx in range(N): item_weight = items[idx][0] item_value = items[idx][1] for bag_weight in range(B+1): if item_weight > bag_weight: dp[idx][bag_weight] = dp[idx-1][bag_weight] else: dp[idx][bag_weight] = max( dp[idx-1][bag_weight - item_weight] + item_value, dp[idx-1][bag_weight]) print(items) print(dp) print(dp[N-1][B]) 늘 친절한 답변에 감사드리며..!저도 더욱 발전해서 코딩센세처럼 지식을 나누는 기쁨을 누릴수있도록 노력하겠습니다! p.s. 사실 솔직히 말씀드리면 print(dp[N-1][B]) 에서 N-1을 해야 하는 이유도 완벽하게 이해하지 못햇슴당 ㅎㅎ..