묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 C를 배운 사람을 위한 선형 자료구조
pTmp 변수를 사용하는 이유
노드를 추가하는 함수나 해제하는 함수에서 헤드노드를 pTmp변수에 대입한 후에 pTmp값을 가지고 코드를 짜는 게 이유가 있나요? 그냥 pTmp를 사용하지 않고 바로 헤드노드를 사용해도 괜찮지 않나요?
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
알고리즘 수업 - 깊이 우선 탐색 2( 백준 24480) 번 질문
강의 제목 : 알고리즘 수업 - 깊이 우선 탐색 2( 백준 24480) 번 질문 안녕하세요! 위 강의 10:14번에 나와있는 정리 노트 관련해서 하나 여쭤보고 싶은 것이 있어요! 5번 '방문 순서를 담기 위해서는 어떤 자료구조를 사용해야 될까?' 이거 답이 리스트(LIST) 인가요?? 혹시 이 정리 노트에 있는 질문 5개에 대한 답변이 적혀있는 PDF 같은 게 있을까요??나중에 자격증 공부할 때 도움될 것 같아서 여쭤봅니다 감사합니다! 강의 영상마다 질문이 있으면 언제든 그리고 바로 질문 남겨주세요! 질문할 때 가장 정확하게 이해할 수 있습니다.해당 영상과 관련된 질문들을 해주실 때 제가 가장 정확히 답변 드릴 수 있습니다!취업 전반의 상담이나, "제 코드가 왜 틀렸는지 알려주세요"와 같이 광범위한 질문은, 질문자의 상황에 따라 답변이 달라질 수 있기 때문에, 정확한 답변을 드리기가 어렵습니다 :(이런 분들을 위해서는 멘토링 항목으로 별도 제공하고 있으니, 다음 링크를 참고해주세요!이 링크를 통해서는 본인의 코드가 왜 틀렸는지 모를 때 질문을 주셔도 좋고, 취업 전반(면접 준비, 자소서, CS 면접 등)에 관련한 질문을 주시면 답변 드리겠습니다 :)"이 질문은 해도 되나?"라는 생각이 드신다면 우선 남겨주세요! 제가 답변 드리기 어려운 건 멘토링에 올려 달라고 재요청 드리겠습니다 :)
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
코드 순서 차이
1012번 문제 이전에 dfs. bfs 강의 부분에서 제가 기억하기로는 ret++; dfs(i, j); 이렇게 써서 제출 후 정답은 맞았습니다만...이 두 코드의 위치가 바뀌어도 상관없는 걸로 아는데제가 알고 있는 것이 맞나요?아니면 혹시 코테 볼 때는 dfs(i, j); ret++; 이렇게 해야만 하나요???
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
실제 비슷한 문제를 sort()함수 사용하여 푼다면
코딩테스트 실전에서 sort()를 이용하여 풀고 제출해버리면영상에서 설명해주신 방법으로 해결한 답에 비해 떨어질 확률이 높아질까요?두 가지 방법으로 문제 풀어 보았고 둘 다 한번에 성공하긴 했습니다 다만, 실전문제에서 sort()함수를 사용하지 말라는 조건이 없다면 굳이 영상에서의 방법을 써야하는지도 궁금합니다.실전코테 시 문제가 여러개 나올 수도 있고 심적 압박(?)으로 반복문을 써야한다고 알고 있어도 긴장해서 sort()쓸 것 같아서요 ㅜㅜ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
다른 풀이 리뷰
안녕하세요 제가 강의 듣기 전에 혼자 풀어봤는데요function solution(s) { let answer = 0, stack = [], tmp = 0; // tmp : 잠시 * 개수 저장하는 곳 s = s.replaceAll("()", "*"); for (let x of s) { if (x === ")") { while (stack.length) { let top = stack.pop(); if (top === "*") tmp++; else { // 여는 괄호 나오면 answer += tmp + 1; for (let i = 0; i < tmp; i++) stack.push("*"); // 괄호들은 빼고 *만 넣기 tmp = 0; //tmp초기화 break; } } } else stack.push(x); } return answer; }일단 초반에 레이저 부분은 *으로 바꾸었고 바꾼 s 로 for 문 돌려서 풀었습니다..!(**)와 같이 되면 answer에 별개수+1 을 더하고괄호를 제외한 ** 별들만 다시 stack 에 넣어서 계산했습니다..!혹시 위 코드가 틀리거나 문제점이 있을까요 ???
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강의교재 p90 erase() 이터레이터
1.v.erase(v.begin(), v.begin() + 3); 강의교재를 보시면 위의 코드가 나오는데요 저 코드를 실행한 결과 1~9까지의 숫자중에서 1~3까지의 숫자가 사라졌는데요 제가 해석한 바로는 앞의 begin을 으로 부터 +3이니깐 주소가 3칸 옮겨간거고 그리고 범위가 ()이므로 원래는 1~4이지만 4를 제외하고 1~3만 제거가 되는건가요? 2.auto a = find(v.begin(), v.end(), 100);같은 페이지에 있는 코드입니다.100을 찾아서 인덱스값을 a에 넣어야할것같은데요 9보다 그니깐 인덱스 값은 6이 되어야 하는것이아닌가요>?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-B 재귀함수 관련 질문입니다.
go(here + 1); a[here] = ~a[here]; go(here + 1);go함수 내에서 강사님이 하신대로 위와 같이 호출하면 기저사례에 8가지 경우의 수(3행기준)가 모두 나온다는 것을 재귀함수 트리를 그려서 확인을 했을뿐 이해가 가지 않습니다..go(here + 1); a[here] = ~a[here]; go(here + 1); a[here] = ~a[here]; //원복뒤집고 go함수 호출하고 그 함수가 종료되고 다시 돌아왔을 때 바뀐 배열을 다시 뒤집는 과정이 있어야 함수가 똑바로 작동할거라고 계속 생각하게 되네요. 예를 들어, {4,5,1}이 있을 때 , go(1)이 호출되고 첫번째go(2)함수가 진행되다가 함수가 종료되어서 다시 go(1)로 돌아왔을 때, {4,5,1}이 되어있어야 기저사례에서 8가지 경우가 제대로 나올텐데 왜 원복 코드없이도 8가지가 제대로 나오는지 이해가 안됩니다!!!!!!!!!
-
해결됨코딩테스트 [ ALL IN ONE ]
강의 교재 공유 부탁드립니다~
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강사님 강의 너무 잘 보고 있습니다.교재 공유 요청 했는데 확인 한번 부탁드리겠습니다~!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강의교재p84
cout << lower_bound(a.begin(), a.end(), 3) - a.begin() << "\n";페이지 중간을 보시면 이러한 코드가 나와있는데요 밑에 페이지에 있는 설명을 읽어보니 주소값의 차이가 2이기 때문에 2가나온다고 설명이 되어있습니다.그리고 p85를 보면 cout << &*lower_bound(a.begin(), a.end(), 3)<< "\n";이러한 코드가 나와있는데요 이 코드는 주소값을 반환하는것으로 나와있는데 맨 첫번째코드도 주소값을 반환하는것으로 알고있습니다. 두 코드의 차이는 &*가 붙어있다는뜻인데 &*기호가 붙어있어도 똑같이 주소를 나타낸다는 코드인가요?하지만 맨 처음 코드에서 -a.begin()을 해주고 나서 코드를 실행해보니깐 오류가 뜹니다..어떻게 해야할까요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
조건문에 의한 시간초과
package 인프런; import java.io.*; import java.util.*; public class i0302 { public static ArrayList<Integer> solution (int N, int M, int[] arrN, int[] arrM) { ArrayList<Integer> answer = new ArrayList<>(); Arrays.sort(arrN); Arrays.sort(arrM); int p1 = 0; int p2 = 0; while(p1 < N && p2 < M) { if (arrN[p1] == arrM[p2]) { answer.add(arrN[p1]); p1++; p2++; } else if (arrN[p1] > arrM[p2]) { p2++; } else if (arrN[p1] < arrM[p1]) { p1++; // 여기가 문제 } } return answer; } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int[] arrN = new int[N]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { arrN[i] = Integer.parseInt(st.nextToken()); } st = new StringTokenizer(br.readLine()); int M = Integer.parseInt(st.nextToken()); int[] arrM = new int[M]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < M; i++) { arrM[i] = Integer.parseInt(st.nextToken()); } ArrayList<Integer> answer = solution(N, M, arrN, arrM); for(int x: answer) { System.out.print(x + " "); } } } 안녕하세요. 강의 학습 전에 코드를 작성했는데 자꾸 시간초과가 나서 확인해보니 강사님 강의에서 14번째 라인(else p2++)를 저는 else if를 사용해서 나는 문제였던 것 같습니다. 마지막에 else if를 else로 바꾸는 것이 크리티컬하게 성능 차이를 낼 수 있는 것인가가 궁금합니다. 감사합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-C 범위 관련해서 궁금한 것이 있습니다.
결국 이 문제에서 구하는 것은 " 잠기지 않은 구역의 수"이기 때문에, 입력을 받으면서 입력받은 지역 중 최대 높이를 구해서 100까지 for을 돌리지 않고 최대 높이 까지만 for을 돌려도 되지 않나요? 100까지 돌리신 이유가 궁금합니다!!제가 작성한 코드 첨부 드립니다!#include <bits/stdc++.h> using namespace std; const int n_max = 101; int dy[4] = {-1, 0, 1, 0}; int dx[4] = {0, 1, 0, -1}; int m,a[n_max][n_max],visited[n_max][n_max]; int ret = 1; // #2648: 안전 영역 // 메모 : DFS 깊이 우선선 탐색 -> component 찾기기 void dfs(int y, int x, int d) { visited[y][x] = 1; for(int i = 0; i < 4; i++) { int ny,nx; ny = y + dy[i]; nx = x + dx[i]; if(ny >= m || ny < 0 || nx >= m || ny < 0) continue; if(a[ny][nx] > d && !visited[ny][nx]) { dfs(ny, nx,d); } } } int main() { int maxHigh = 0; //비가 오지 않을 경우도 고려려 cin.tie(NULL); cout.tie(NULL); vector<int> results; //Input //1. 배열의 크기 cin >> m; //2. 2차원 배열 입력 받기 for(int i = 0; i < m ; i++) { for(int j = 0; j < m ; j++) { cin >> a[i][j]; maxHigh = a[i][j] > maxHigh ? a[i][j] : maxHigh; } } // 최대 높이 많큼 비가 왔을 때 부터 기준치를 낮춰가며 안전구역개수의 최대 지점을 구함 for(int d = 1; d <= maxHigh; d++) { //배열 초기화 fill(&visited[0][0], &visited[0][0] + n_max * n_max , 0); int cnt = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < m; j++){ if(a[i][j] > d && visited[i][j] == 0) { cnt++; dfs(i,j,d); } } } //안전영역 최대 개수 갱신 ret = max(ret,cnt); } // 디버깅 /*for(int i = 0; i < m; i++){ for(int j = 0; j < m; j++){ cout << a[i][j] << ' '; } cout << '\n'; } */ cout << ret << '\n'; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-A
해설 중 예제에서 질투심이 3일 때가 답이 되는 것은 이해했습니다만,질투심이 4일 때 학생 수 5명을 충족시키지 못해 안 된다고 하셨는데, 문제 조건에 보석을 못 받는 학생이 있을 수도 있다고 나와 있어서 정답은 아닐지언정, 조건을 만족하는 케이스가 아닌가 싶습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
0주차 unique() 강의 질문
unique() 함수를 설명하실때요cout << it -v.begin() << '\n';를 쓰셨는데요여기에서 왜 it-v.begin()이라고 써주신건가요? 그냥 it만 들어가도 되는거아닌가요? it가 이터레이터를 반환한다고 했는데 그럼 it가 5가 되는거 아닌가요?코드 줄을 바꿀때 어떨때는 '\n'을 쓰시고 어떨때는 "\n"을 쓰시고 또 어떨때는 " " 을 쓰시던데 차이가 있을까요?그리고 v.erase(unique(v.begin(), v.end()), v.end());를 했는데 왜 뒤에 있는 숫자를 지워주는 코드가 되는것인가요?v.end()는 무엇을 기준으로 하는것인가요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
초기화 관련 질문
강사님 안녕하세요. bottom-up 방식으로 풀때처럼 처음 다이나믹배열을 초기화할때 0행과 0열을 누적합으로 초기화 한 후 다음과 같이 풀었는데, 잘못된 방법일까요??제생각엔 재귀호출이 더 적게 되어서 효율적이라고 생각해 이렇게 풀었습니다. import sys sys.stdin = open('in5.txt','r') def dfs(y,x): if dis_arr[y][x] > 0: return dis_arr[y][x] else: dis_arr[y][x] = min(dfs(y-1,x),dfs(y,x-1)) + arr[y][x] return dis_arr[y][x] if __name__=="__main__": n = int(input()) arr = [list(map(int,input().split())) for _ in range(n)] dis_arr = [[0]*n for _ in range(n)] # 거리저장배열 dis_arr[0][0] = arr[0][0] # 첫번째 거리 저장 # 0번째 행과 열 누적합 하기 for i in range(1,n): dis_arr[0][i] = dis_arr[0][i-1] + arr[0][i] dis_arr[i][0] = dis_arr[i-1][0] + arr[i][0] print(dfs(n-1,n-1))
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
반례가 있는지 알 수 있을까요?
function solution(arr) { let result = []; const convertArray = arr; for (let i = 0; i < arr[0].length - 1; i++) { const mento = arr[0][i]; for (let j = 0; j < arr.length; j++) { for (let k = 0; k < arr.length; k++) { const menti = arr[k][j]; if (j > i) { break; }; if (j !== k) { if (mento <= menti) { const index = convertArray[k].indexOf(menti); convertArray[k][index] = 'not'; } }; }; }; }; for (let i = 0; i < arr[0].length - 1; i++) { const mento = arr[i][i]; for (let k = 0; k < arr[0].length; k++) { const menti = convertArray[i][k]; if (typeof menti === 'number' && mento !== menti && typeof mento === 'number') { result.push([mento, menti]); }; }; } return result.length; }; 저는 위처럼 풀었습니다.제가푼건 O(n^3) + O(n^2)인 것 같은데제가 푼 방법에서 반례가 있을까요?다른 케이스들로 시뮬레이션 돌렸는데 잘 생각이 나지 않아 질문드립니다.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
다른 풀이
강의 듣기 전에 혼자 풀어보았는데function solution(board, moves) { let answer = 0, stacks = Array.from({ length: board[0].length }, () => []), moveStack = []; for (let x of board.reverse()) { // [3,5,1,3,1] for (let i = 0; i < board[0].length; i++) { if (x[i] === 0) continue; stacks[i].push(x[i]); } } for (let m of moves) { m--; if (stacks[m].length === 0) continue; // 해당 번호에 인형 다 꺼냈을때 let top = stacks[m].pop(); if (moveStack.length === 0) { // moveStack 에 아무것도 없을때 moveStack.push(top); continue; } let movesTop = moveStack.pop(); if (movesTop === top) answer += 2; else { moveStack.push(movesTop, top); } } return answer; }저는 처음에 board 배열 형태를 pop하기 쉽게 변형한 뒤에 moves 따라 계산했는데이 코드로 짜면 이중 for 문 때문에 시간 효율이 안좋을까요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-E 뮤탈리스크 질문입니다!
코드를 짜면서 scv가 하나라도 파괴되고 그 후에 공격하는 6가지 경우 중에 유효하지 않은 공격이 있다고 생각했습니다.예를 들어 상태값 (2,2,0)에서 {9,3,1}과{3,9,1}만 유효하고 나머지 공격들은 유효하지않다고 판단했습니다. 한가지 예로{1,93,9}인 경우에 파괴된 scv를 먼저 공격하는게 말이 안된다고 생각했습니다.근데 이런 생각을 할 필요가 없는게 어차피 유효하지 않은 공격에서는 최단거리가 나올수 없기 때문에 구별하는 코드를 넣을 필요가 없다고 결론내렸는데 이게 맞는 생각인가요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
원탐과 원복
강의 듣고 DFS랑 무슨 차이인지 한번에 정리가 안되어 글 남겨봅니다..DFS는 경로에 대해 완전 탐색하는 것은 맞으나 그 경로의 모든 경우의 수를 탐색하는 것은 아니다.왜냐하면 앞서 지나간 자리에는 visited가 걸려있으므로 목적지를 찍은 후 재귀로 중간 부분으로 돌아온다면 다른 경로로 진입했을 시 visited가 걸려있을 수 있고 어쩌면 목적지에 도달할 수 없을 수도 있다.완탐과 원복에서는 목적지까지 도달한 후 왔던 경로에 대해 방문 처리를 원복하기 때문에 목적지로 도달하는 모든 경로의 경우의 수를 가져갈 수 있다.따라서 코스트가 더 많이 요구되는 것은 완탐과 원복하는 것이며,즉 단순히 원하는 목적지만을 탐색하는 것을 목표하고자 한다면 DFS. 모든 경우의 수를 확인하여 최소, 최대 값을 원한다면 완탐과 원복을 사용하자.라고 이해했는데 뭔가 잘못 이해한 것 같습니다.하지만 그걸 몰라서 질문을 잘 못하겠네요.. 답변 주신다면 감사하겠습니다.
-
해결됨코딩테스트 [ 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을 해야 하는 이유도 완벽하게 이해하지 못햇슴당 ㅎㅎ..