묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결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을 해야 하는 이유도 완벽하게 이해하지 못햇슴당 ㅎㅎ..
-
해결됨자바 코딩테스트 - it 대기업 유제
혹시 이렇게 작성해도 괜찮나요?
코딩테스트 공부하면서 항상 궁금했는데..강의 내용을 보면 클래스나 함수는 꼭 필요한 부분에서만 사용하시는 것 같더라구요..아래처럼 써도 되나요? 면접관님들은 어떻게 생각하실지 궁금합니다. public static int[] run(int[] nums) { return Arrays.stream(nums) .mapToObj(MyNumber::new) .peek(user -> user.one = Integer.bitCount(user.value)) .sorted(Comparator.comparingInt(MyNumber::one)) .mapToInt(MyNumber::value) .toArray(); } public static class MyNumber { final int value; int one; MyNumber(int value) { this.value = value; this.one = 0; } int value() { return value; } int one() { return one; } }
-
해결됨코딩테스트 [ 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]를 걸러내는 방법을 모르겠습니다. 선생님이 한 번 봐주시면서 피드백 좀 주시면 감사하겠습니다!
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
이 코드는 왜 안되는 건가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); System.out.println(solution(str)); } private static String solution(String str) { String str1 = str.replaceAll("[^a-zA-Z]", "").toLowerCase(); System.out.println(str1); StringBuilder builder = new StringBuilder(str1.toLowerCase()); return !str1.isEmpty() && str1.contentEquals(builder.reverse()) ? "YES" : "NO"; }
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
1260 문제 풀이에서는 함수 global로 변수 선언
유형1 문제 풀이에서는 함수 선언에서 global visited, graph 로 선언해줬는데, 왜 여기서는 안하신건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안p30~31getline 질문
for(int i = 0; i < T; i++){ getline(cin, s); cout << s << "\n"; } p30페이지에서요 getline을 처음설명하실때 getline은 cout과 달리 개행문자는 상관하지 않고 출력을 해준다고 하셨는데 그렇다면 이미 "\n"은 getline이 없애준다고 생각해도 무방하지 않을까요?? 그렇다면 위에 있는 코드는 왜 기술해주신건가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-O 해설코드 질문입니다.
http://boj.kr/c022d7bcbd21411da64c4a03dbe40cd5안녕하세요 선생님자세한 질문은 공유코드 주석으로 있습니다.해설코드에서 1줄만 바꿔봤는데 왜 틀렸는지 도저히 모르겠습니다.항상 좋은 강의 감사합니다
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
map 을 두개 만들기
제가 강의 듣기전에 미리 풀어봤는데선생님 코드와 다르게 저의 경우function solution(str1, str2) { let answer = "YES", m1 = new Map(), m2 = new Map(); for (let i = 0; i < str1.length; i++) { m1.has(str1[i]) ? m1.set(str1[i], m1.get(str1[i]) + 1) : m1.set(str1[i], 1); m2.has(str2[i]) ? m2.set(str2[i], m2.get(str2[i]) + 1) : m2.set(str2[i], 1); } for (let [key, value] of m1) { if (!m2.has(key)) return "NO"; if (m2.get(key) !== value) return "NO"; } return answer; } str1 , str2 각각 map으로 만든뒤 for문 돌려서 비교했는데 이렇게 풀면 메모리 낭비가 심한 풀이일까요 ? 근데 그다음 영상 '모든 아나그램 찾기' 문제에션 두 문자를 map으로 변형한뒤 비교한 것 같은데, 어떤 상황일 때 어떤 풀이 방법을 선택해야하는지 알수있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-B 유기농 배추 배열 크기 질문입니다.
문제에서 N과 M의 범위가 1 < <50 인데 왜 배열크기를 50으로 잡지 않고 51로 잡으셨는지 궁금합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-K 오답 질문
안녕하세요 선생님!제 나름대로 문제를 풀어보았는데 1%도 안가서 틀려서요. 강의 듣고도 생각해봤는데 안풀려서 질문드립니다~우선 저는 중복 간선을 잡기위해 인접행렬로 구현하였고 그 다음 dfs를 한번만 돌려서 모든 정점을 방문하였는지 visited를 체크하였습니다. 그런 다음 E=V-1도 체크하였고요. 이 로직에 반례가 있는 건지 아님 어이없는 실수라도 했을 것 같은데.. 한번 봐주시면 감사하겠습니다 ㅎㅎ http://boj.kr/09b956c455564531b2305f871257bd3c
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
선생님, 고민이 있습니다. 어떻게 학습을 해야될까요?
안녕하세요 선생님, 강의를 들으며 고민이 생겨서 이렇게 장문의 질문을 남겨봅니다. 지금 이렇게 학습을 하는게 맞는 것인지 방향성에 대해서 좀 회의감이 들어서요. 알고리즘 공부를 시작한지 한 달 반 ~ 두 달 정도 된 것 같은데 벽이 느껴지네요🥺알고리즘에 대해서 아예 아무 것도 모르는 상태로 선생님 강의를 듣기 시작해서인지, 강의를 듣기 전에 문제를 풀어보려고 하면 난이도가 너무 높게 느껴집니다. 한 문제를 풀기 위해 고민을 거의 1시간 ~ 2시간 가까이 해도 문제를 못 푸는 경우가 열에 아홉은 됩니다. 그리고 선생님 강의를 듣고 정답 코드를 이해하는데도 시간이 꽤 걸리다보니 하루에 문제를 많이 풀어도 2문제 정도 밖에 풀지 못 하고 있습니다. 그러다보니 진도도 많이 못 나가고 있네요. 개인 포트폴리오를 위한 프로젝트 공부까지 병행하다보니 더 시간을 쏟고 있지도 못 하네요.선생님 코드를 보면 이해는 됩니다. 그러나 제가 문제 푸는 순간에 그런 아이디어를 떠 올리는 것이 가능한가? 하는 생각이 듭니다. 이런 생각은 비범한 사람들만 떠올릴 수 있는 것 같고, 전 머리가 안 좋아서 이걸 어떻게 떠올려야 하는지 막막하게 벽이 느껴지는 경우가 많습니다.현재 제 실력은 브론즈 문제도 완전히 제대로 풀지 못 하는 것 같은데 강의의 문제는 실버1, 골드4 이렇게 난이도가 제 기준에는 꽤 있게 느껴지네요. 그러다보니 지금 제 실력에 어림도 없는 문제를 푸는 것 같고 이렇게 하는 것이 맞는지 약간 회의감이 들었습니다. (내 힘으로 아예 풀지도 못 하고 있는데 매번 답안만 보고 이해하는게 실력에 도움이 되나? 싶은 느낌이랄까요)올해 상반기에 대기업은 당연히 힘들 것 같고..ㅎ 어쨌든 취업을 하고 싶은데 코테 가망이 없으면 그냥 다른 걸 더 준비해야되나 싶기도 하네요...ㅠ 그냥 이렇게 계속해서 공부를 하는 것이 좋을지 아니면 선생님이 생각하시기에 완전 초보가 시도해보면 좋은 다른 방법이 있는지 궁금해서 이렇게 질문 올려봅니다. 장문의 고민 읽어주셔서 감사합니다.