묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨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을 해야 하는 이유도 완벽하게 이해하지 못햇슴당 ㅎㅎ..
-
해결됨코딩테스트 [ ALL IN ONE ]
강의 수강 후 추천 문제
안녕하세요. 코테는 정말 앞이 캄캄했는데, 강의를 들으면서 문제 푸는 감이 점점 생긴 것 같아요.좋은 강의 감사드립니다!강의를 듣고 해당 알고리즘에 맞는 문제도 풀어보고 싶은데, 추천하는 문제 리스트가 있으실까요?
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
[완전탐색 (재귀, 백트래킹) ] 백준 15650, 15649
안녕하십니까 코딩센세!늘 친절한 답변을 달아주심에 감사의 말씀 드립니다. 문제를 복습하다가 오늘은 도저히 진도가 나가지 않아서 힌트를 요청드리고자 이렇게 질문글을 남깁니다.백준 15650을 풀려고 노력중에 있었습니다. 그런데 선생님의 코드를 적용해서 문제를 해결하려 했으나, 중복되는 수열을 거르는 것에서 어려움이 있습니다.원래 백준 15649는 4 2로 N M의 입력이 주어진 경우 출력은 아래와 같아야 하는데요.1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3 여기서 백준 15650은 4 2로 N M의 입력이 주어졌을 때,1 2 1 3 1 4 2 3 2 4 3 4 이 둘의 차이를 구현하려고 2시간을 넘게 고민해봐도,[1,1][2,1], [2,2][3,1], [3,2], [3,3][4,1], [4,2], [4,3], [4,4]를 걸러내는 방법을 모르겠습니다. 선생님이 한 번 봐주시면서 피드백 좀 주시면 감사하겠습니다!