묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
k번째 수 질문드립니다
여기서 n을 input으로 받아서 활용을 안 하고 있는 거 같은데그러면 사용자의 입력에 따라 n이랑 리스트 a의 개수가 다를 수도 있는 거 아닌가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
슬라이딩
이미 알거 같지만 한 번 더 질문을 해볼게요 !!슬라이딩 유형은 미리 셋팅이 있어야 하는 것인가요?? 또한 import java.util.*; class Main { private int[] solution(int n, int m, int[] arr) { HashMap<Integer, Integer> map = new HashMap<>(); int index = 0, lt = 0; int[] answer = new int[n - m + 1]; while(lt < n - m + 1) { for (int rt = 0; rt < m; rt++) { map.put(arr[lt + rt], 1); } lt++; answer[index++] = map.size(); map.clear(); } return answer; } public static void main(String[] args){ Main T = new Main(); Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = in.nextInt(); } for(int a : T.solution(n, m, arr)) { System.out.print(a + " "); } } } 이렇게 풀면 시간 복잡도가 O(N^2) 이라서 시간 초과가 일어나는 것이죠 !?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
BFS x,y 축을 반대로 사용하시는 이유에관해 질문 있습니다.
안녕하세요 선생님! 좋은강의 만들어 주셔서 감사합니다. 다름아니라 BFS 를 비롯해서 2차원 배열을 다룰때 선생님께선 x,y 축을 반대로 사용하시는 것 같은데 개인적으로 왜 이러한 방식을 사용하시는지 궁금합니다.!감사합니다.!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-E
if(ret.size()) cout << ret << "\n"; 이 부분에서 ret.size()가 의미하는 부분을 정확히 모르겠습니다.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
해당 강의 코드에서 16-17번째 줄 코드 질문
안녕하세요 강의 듣다가 궁금한점이 있어서 질문 드립니다..!해당 강의 16분 37초 기준으로 16-17번째 줄 코드를 보면if(j!==i && (product[j][0]+product[j][1])>money) break; if(j!==i && (product[j][0]+product[j][1])<=money){이렇게 적으셨는데 break 하는 부분에 꼭 굳이 j!==i 도 적어야하나요 ??저의 경우function solution(bud, product) { let answer = 0, total = product.flat().reduce((prev, curr) => prev + curr); product.sort((a, b) => a[0] + a[1] - (b[0] + b[1])); for (let i = 0; i < product.length; i++) { // 50% 할인 쿠폰 적용할 상품 for 문 돌리기 let money = bud - (product[i][0] / 2 + product[i][1]); // 사용 가능한 금액 let cnt = 1; // 할인받은 애는 되니까 1 시작 for (let j = 0; j < product.length; j++) { if (i === j) continue; if (money < product[j][0] + product[j][1]) break; money -= product[j][0] + product[j][1]; cnt++; } answer = Math.max(answer, cnt); } return answer; }이렇게 i===j 를 만나면 continue 로 하고 예산이 넘어갈때만 break 두돌록 했는데 이렇게 잓성해도 괜찮을까요 ?
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
재귀대신 스택으로 구현하면 안될까요?
이 문제의 재귀는 이해가 됬지만, 다른 문제들에서 마주치는 재귀함수들은 손이 잘 안가고, 항상 남의코드를 봐야만 이해가 되더라구요.여기서 dfs함수를 스택으로 구현하면 라인이 더 길어져 재귀보다는 깔끔하지가 않은데, 이해 및 구현이 쉬운거 보다 명확한거 같은데, 코딩테스트의 재귀들은 모두 스택으로 구현하면 어떨지 궁금합니다.
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
[활용(바텀업DP)] 8:08, 10:55
안녕하십니까 코딩센세! 이번에도 어김없이 질문 드리고 싶은 부분이 있어서 질문글을 남겨봅니다. 활용(바텀업 DP) 수업에서, 8:08초와 10:55초 에서 작성하신 if문이 잘 와닿지가 않습니다. 8:08초의 경우, if idx+ interview[idx][0] > N 으로 작성하셨는데요. 설명 역시 논리적으로 다가왔습니다. 당연히 문제에서 주어진 N의 범위보다 크다면 인덱싱이 불가능할테니 idx보다 더 뒤에 있는 dp[idx+1]의 값으로 할당하는 거라고 이해했습니다. 문제는 10:55초 입니다. 작성하신 코드는 if weight < B 인데요. 부연 설명은 "가방의 무게보다 작으면 예외 처리를 한다"라고 이해했습니다. 문제의 요구사항에 따르면 가방의 무게보를 초과했을 때 예외처리를 해야 하지 않나? 라는 의문이 들었는데요. 아직 의문을 해결하지 못하여 선생님의 코드가 잘 이해가 되지 않는 상태에 있습니다... 저의 질문을 읽어주신다면, if weight < B 라고 조건을 걸어야 하는 부분에 대해 조금 더 상세한 설명을 부탁드립니다! p.s. 선생님 혹시 7강에 대한 정답 코드는 볼 수 없는건가요? 수업자료에 작성되어 있지 않아서 문의드립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
BFS 당근마켓 승원이 문제 질문이 있습니다!
안녕하세요! 큰돌님. 문제를 풀다가 자꾸 visited 배열에 오버플로우가 일어나는 것 같아서 예시 코드와 비교해 봤더니, 큰돌님은 max_n = 104로 배열의 크기를 최대로 정의 해 놓으셨더라구요.그래서 큰돌님 처럼 다음과 같이 배열의 크기를 최대로 해놓고 하니, 문제가 해결되었습니다.const int max_n = 104;저는 입력받는 코드를 따로 만들지 않아서, 크기를 예측할 수 있는 코드여서 5X5 로 정의를 해놓았는데, 왜 오버플로우가 일어나는 지 궁금합니다! 제가 작성했던 코드 첨부하겠습니다.// Online C++ compiler to run C++ program online #include <bits/stdc++.h> using namespace std; const int max_n = 104; int dy[4] = {-1, 0, 1, 0}; int dx[4] = {0, 1, 0, -1}; int main() { int N = 5; int M = 5; int x,y; int visited[N][M] = {0,}; //방문 노드 //시작 지점 int sx = 0, sy = 0; //끝 지점 int ex = 0, ey = 4; //MAP int map[N][M] = { {1,0,1,0,1}, {1,1,1,0,1}, {0,0,1,1,1}, {0,0,1,1,1}, {0,0,1,1,1} }; queue<pair<int, int>> q; //깊이 탐색을 위한 큐 visited[sy][sx] = 1; // start 위치 방문 처리 q.push({sy,sx}); while(q.size()) { tie(y,x) = q.front(); q.pop(); for(int i = 0; i < 4 ; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if(ny < 0 || ny >= N || nx < 0 || nx >= M || map[ny][nx] == 0) continue; if(visited[ny][nx]) continue; visited[ny][nx] = visited[y][x] + 1; q.push({ny, nx}); } } printf("%d\n", visited[ey][ex]); // 최단거리 디버깅 for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ cout << visited[i][j] << ' '; } cout << '\n'; } return 0; }
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
다른 풀이
강의 보기전에 혼자 풀어보았는데 저의 경우에는 미리 순위를 추출해서 result ㄹ라는 변수에 저장한뒤 for문을 돌려서 result 에 있는 순위를 비교해서 답을 내도록 했는데 혹시 틀렸거나 비효율적이라면 어떤 점이 문제인지 알려주시면 감사하겠습니다..!function solution(test) { let a = test.length, b = test[0].length; let result = Array.from({ length: b + 1 }, () => []); // [[], [], [], [], []] let answer = 0; for (let x of test) { // [3,4,1,2] for (let i = 0; i < b; i++) { result[x[i]].push(i + 1); } } for (let i = 1; i < b + 1; i++) { // 0~4 for (let j = 1; j < b + 1; j++) { // result[i] 랑 result[j] 비교 if (i === j) continue; let isMento = true; for (let n = 0; n < a; n++) { if (result[i][n] <= result[j][n]) { isMento = false; break; } } isMento && answer++; } } return answer; } let arr = [ [3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2], ]; console.log(solution(arr));
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
따로 function 빼기
제가 강의 듣기 전function solution(num) { let answer = []; for (let x of num) { let isPrime = true; x = Number(x.toString().split("").reverse().join("")); if (x <= 1) continue; for (let i = 2; i <= x / 2; i++) { if (x % i === 0) { isPrime = false; break; } } isPrime && answer.push(x); } return answer; } let arr = [32, 55, 62, 20, 250, 370, 200, 30, 100]; console.log(solution(arr)); 이런식을로 풀었는데영상에 보니까 isPrime(n) 을 따로 빼서 하신것같은데이렇게 함수를 따로 빼야하는 이유가 있는건가요??
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
질문
제가 영상 보기 전 혼자 풀어보았는데function solution(n, arr) { let answer = 0, max_sum = 0; for (let x of arr) { let sum = 0, temp = x; while (temp) { sum += temp % 10; temp = Math.floor(temp / 10); } if (max_sum < sum || (max_sum === sum && answer < x)) { answer = x; max_sum = sum; } } return answer; } let arr = [128, 460, 603, 40, 521, 137, 123]; console.log(solution(7, arr)); 저는 if 문을 (max_sum < sum || (max_sum === sum && answer < x)) 이렇게 하나로 묶어서 썼는데 괜찮을까요 ? 그리고 선생님께서 max를 초기화할때 Number.MIN_SAFE_INTEGER 로 하셨는데 어차피 각자리수의 합이 0보다는 클것이라는 생각이 들어서 저의 경우엔 0으로 초기화 했는데 괜찮을까요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
for 문을 1부터 마지막 인덱스까지
안녕하세요 제가 강의 보기전에 혼자 풀어봤는데function solution(s) { let answer = s[0]; let cnt = 1; for (let i = 1; i < s.length; i++) { if (s[i] === s[i - 1]) { cnt++; continue; } if (cnt > 1) { answer += cnt + s[i]; cnt = 1; } else { answer += s[i]; } } return answer; } let str = "KKHSSSSSSSE"; console.log(solution(str)); 저 같은 경우 미리 answer 에 첫번째 글자를 넣어서 시작했고for 문을 1부터 시작해서 그 전의 값과 비교하는 식으로했는데 이렇게 풀어도되는걸까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-X 문제 틀린로직
안녕하세요 큰돌선생님..해당 문제를 풀었는데 예제 입력 1번과 2번까지는 잘 나오는데 나머지가 틀렸다고해서 질문드립니다. 선생님 코드와 아주 큰 틀에서는 비슷한것 같긴한데, 제 코드가 우선 깔끔하지는 못한것 같습니다. 따로 변환된 좌표를 받아서 원복시키는것이 아닌 flag 변수를 사용하여 원복시키는 코드로 작성하였습니다.. 오래 생각해보았는데 진전이 없어 질문드립니다. 혹시 어떤 부분이 잘못된 로직인가요??http://boj.kr/468e705a31f141d7aaf8dea5cc6f4dfd
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-J
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 선생님. 일단 문제는 동전뒤집기와 같은 원리로 풀긴 했습니다만 지금까지 풀면서 느낀건데 약간 이번에 0,1로 나누는 것처럼 새로운 아이디어를 아에 생각해내지 못하는 것 같습니다. 뒤로 갈수록(문제티어가 올라갈수록) 이런 생각들이 많이 필요한지(?) 궁금합니다. 추가로 제가 작성한 코드에 이런 코멘트가 달렸습니다. 연산자 우선순위 때문에 괄호를 명확히 써달라는거 같은데 무시해도 되는 부분인가요?Main.cc: In function ‘int main()’: Main.cc:45:33: warning: suggest parentheses around ‘+’ inside ‘<<’ [-Wparentheses] 45 | for(i = 0; i < (1 << (X-1)*Y+1); i++) { | ~~~~~~~^~http://boj.kr/7f52d75051654e338b6b5d369cc55202
-
미해결Do it! 알고리즘 코딩테스트 with C++
백준 1876여행 유니온 파인드 질문있습니다.
#include <iostream> #include <vector> #include <queue> using namespace std; #define ll long long #define endl "\n" void merge(int a, int b); int find(int a); vector<int> parent; vector<int> paths; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n; cin >> m; parent.resize(n + 1); for (int i = 0; i <= n; ++i) { parent[i] = i; } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { int v; cin >> v; if (v == 1) { merge(i, j); } } } for (int i = 1; i <= n; ++i) { int n; cin >> n; paths.push_back(n); } int prevPath = find(paths[0]); for (int path : paths) { int curPath = find(path); if (curPath != prevPath) { cout << "NO"; return 0; } prevPath = curPath; } cout << "YES"; return 0; } void merge(int a, int b) { a = find(a); b = find(b); if (a != b) parent[b] = a; } int find(int a) { if (a == parent[a]) return a; return parent[a] = find(parent[a]); } 왜맞틀인거같은 느낌이 듭니다.책에 있는 내용 분석해서 이해는 하였는데 제가 짠 코드가 왜 틀린것인지 모르겠습니다.의심되는 부분은 처음에 merge하는 for문인거같은데 책처럼 인접리스트를 사용하지 않고 v가 1이라면(i행과 j열이 연결되어 있다면) 그냥 바로 merge하여 병합하였는데 이부분에 예외가 있는것인지 아니면 다른 부분에서 예외가 있는것인지 감이 안 잡히는데 어디가 잘 못된것인지 한번 봐주실 수 있나요?감사합니다 :)
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
기억 (누적합)
문제 1. 수열 (#2259)오타 혹은 백준 문제번호가 바뀐 것 같습니다.2259 -> 2559 문제 2. 수열 가장 크게 만들기 (#1912)모든 수열이 음수인 경우 0번째 index의 값이 가장 크게 되므로 print(max(prefix[1:])) 로 해주면 좋을 것 같습니다
-
미해결Do it! 알고리즘 코딩테스트 with C++
백준 2251 C++ 질문 있습니다.
해당 강의가 없어 직접 질문 하게 되었습니다.2251번 책을 보면 이동 가능한 경로가 A -> B, A ->C, B -> A, B -> C, C -> A, C ->B 로 총 6개인것은 이해를 했습니다. 근데 최초의 물이 C에만 담겨있는데 왜sender, receiver를 6크기의 배열로 선언해주고 아래처럼 for문을 돌리고 없는 물을 처음에 6개의 경로에 따라 퍼다 나르는지 이해가 잘 가지 않습니다.for (int k = 0; k < 6; ++k){ // next[0] = a, next[1] = b, next[2] = c int next[] = { a, b, c }; next[Receiver[k]] += next[Sender[k]]; next[Sender[k]] = 0; // 대상 물통의 용량보다 물이 많아 넘칠 때 if (next[Receiver[k]] > now[Receiver[k]]) { // 초과하는 만큼 다시 이전 물통에 넣음 next[Sender[k]] = next[Receiver[k]] - now[Receiver[k]]; // 대상 물통은 최대로 채움 next[Receiver[k]] = now[Receiver[k]]; } // A와 B의 물의 양을 통하여 방문 배열 체크 if (visit[next[0]][next[1]] == false) { visit[next[0]][next[1]] = true; q.push(make_pair(next[0], next[1])); // A의 물의 양이 0일 때 C의 물의 용량을 정답 변수에 저장 if (next[0] == 0) { ret[next[2]] = true; } }}
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-F 질문 있습니다!
http://boj.kr/7687fd79d7f14a06876f12bc7d02e5a7안녕하세요 선생님 제 생각이 틀린 건 분명한데 어떻게 틀렸는지 이해가 잘 안됩니다 if(s[i] >= 'A' && s[i] <= 'Z'){ s[i] = s[i] + 13; if(s[i] > 'Z') s[i] = s[i] - 26; }else if(s[i] >= 'a' && s[i] <= 'z'){ s[i] = s[i] + 13; if(s[i] > 'z') s[i] = s[i] - 26; }아마 이부분에서 논리적인 오류가 있는것 같은데 잘 모르겠습니다제 생각에 13을 먼저 더하고 그 이후에 범위를 벗어난 부분만 26을 빼면 될거라 생각했는데 이게 왜 안되는지 이해가 잘 안됩니다. ps. 새해 복 많이 받으세요
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-E 분할 정복 반례를 도저히 못찾겠어요
안녕하세요 큰돌님.2-E 쿼드 트리 문제 반례를 도저히 못찾겠습니다. 97% 쯤인가 여기서 자꾸 실패가 떠요.백준 질문 게시판에 올라가있는 테스트 케이스를 넣어도 다 통과는 하는데 무슨 반례에 걸리는지 도무지 감이 안잡힙니다. 한번 봐주실 수 있나요? #include <bits/stdc++.h> using namespace std; int N, adj[70][70]; string input; string go(int sy, int sx, int size) { int ey = sy + (size - 1); int ex = sx + (size - 1); // cout << sy << " " << sx << " " << ey << " " << ex << '\n'; if (size == 2) { if (adj[sy][sx] == adj[sy][ex] && adj[sy][ex] == adj[ey][sx] && adj[ey][sx] == adj[ey][ex] && N > 2) return to_string(adj[sy][sx]); string subret = "("; subret += to_string(adj[sy][sx]); subret += to_string(adj[sy][ex]); subret += to_string(adj[ey][sx]); subret += to_string(adj[ey][ex]); subret += ")"; return subret; } string lt = go(sy, sx, size / 2); string rt = go(sy, sx + size / 2, size / 2); string lb = go(sy + size / 2, sx, size / 2); string rb = go(sy + size / 2, sx + size / 2, size / 2); // cout << "lt: " << lt << " rt: " << rt << " lb: " << lb << " rb: " << rb << '\n'; if (lt.size() == 1 && lt == rt && rt == lb && lb == rb && N > 2) return lt; string ret = "("; ret += lt; ret += rt; ret += lb; ret += rb; ret += ")"; return ret; } int main() { cin >> N; for (int i = 0; i < N; ++i) { cin >> input; for (int j = 0; j < N; ++j) { adj[i][j] = input[j] - '0'; } } string ret = ""; if (N == 1) ret = "1"; else { ret = go(0, 0, N); } cout << ret << '\n'; return 0; }
-
해결됨글로벌 개발자로 성장하는 < 코딩 실무 영어 /> 마스터 클래스
오타가 있는 것 같아서요.
한국인 머리 아프게 만드는 영어의 특징의 14:03초에 Ask for의 예제가 Ask for the manager for confirmation. 으로 나오는데 Ask the manager for confirmation.으로 되어야 하는 거 아닌가 해서요. 강의 재밌네요. 잘 듣고 있습니다.