묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
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.으로 되어야 하는 거 아닌가 해서요. 강의 재밌네요. 잘 듣고 있습니다.
-
미해결비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
퀴즈 답안
퀴즈 답안지는 따로 제공되지 않나요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
max와 findindex 사용해서 풀어도 되나요?
function solution(arr) { let answer = Array.from({ length: arr.length }, () => 0); let rank = 1, max = Number.MAX_SAFE_INTEGER; for (let i = 1; i <= arr.length; i++) { let idx = arr.findIndex((val) => val === Math.max(...arr)); if (arr[idx] === max) { // 동점자이면 answer[idx] = rank; } else { answer[idx] = i; rank = i; } max = arr[idx]; arr[idx] = -1; } return answer; } let arr = [87, 89, 92, 100, 76]; let arr2 = [20, 20, 20, 10, 50, 15]; console.log(solution(arr)); 저 혼자 풀었을 때 이중 for문이 아닌 위와 같이 풀었는데 혹시 이렇게 풀어도 되는걸까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
시간 복잡도(7.소수의 개수(에라토스테네스 체))
안녕하세요해당 문제의 답을 스스로 작성해보았는데요이렇게 했더니 n의 숫자가 작을 때는 잘 작동 되지만 숫자가 커지면 작동이 안됩니다. 선생님의 코드처럼 이중 for문을 사용했는데 선생님의 코드는 잘 작동이 되고 제 코드는 잘 작동이 되지 않습니다.. 선생님의 코드는 배수를 활용해서 더 빠를 것이라고 생각이 되긴 하는데, 제 코드를 어떻게 수정하면 좋을까요n = int(input()) cnt =[0] * (n+1) count =0 for i in range(1,n+1): for j in range(2,n+1): if i % j == 0: cnt[i] = cnt[i] + 1 if cnt[i] == 1: count = count +1 print(count)
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
for문 범위 관해서 질문드립니다
섹션 2의 3번 문제에서는 첫번째 for문에 n을 넣어서 돌렸는데섹션 2의 4번 문제에서는 첫번쨰 for문에 a를 넣어서 돌렸습니다. 두 문제가 비슷한 유형인거같아서 왜 같은 방식으로 for문을 돌리지 않는지 헷갈려서 질문남깁니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
BFS 당근마킷 엔지니어 승원이 문제 제꺼 한번 봐주실 수 있나요?
안녕하세요 큰돌님.문제 해답 보기 전에 영상 멈추고 풀기 시작했다가 1시간이나 까먹었네요.... 이래도 성장 할 수 있을지 고민입니다.개인적인 고민은 뒤로 두고 다음의 코드로 풀긴 했는데 이게 맞는 코드인지 봐주실수 있나요?항상 질문 답변 해주셔서 감사합니다. #include <bits/stdc++.h> using namespace std; int N, M, startY, startX, destY, destX, adj[104][104]; int dy[] = {1, 0, -1, 0}; int dx[] = {0, 1, 0, -1}; map<pair<int, int>, int> visited; void bfs(int y, int x) { pair<int, int> pos = {y, x}; visited[pos] += 1; queue<pair<int, int>> q; q.push(pos); while (q.size()) { auto loc = q.front(); q.pop(); for (int i = 0; i < 4; ++i) { int ny = loc.first + dy[i]; int nx = loc.second + dx[i]; pair<int, int> prevOffset = {loc.first, loc.second}; pair<int, int> nextOffset = {ny, nx}; if (ny < 0 || nx < 0 || ny >= M || nx >= N) continue; if (visited[nextOffset]) continue; if (adj[ny][nx] == 0) continue; visited[nextOffset] = visited[prevOffset] + 1; q.push(nextOffset); if (ny == destY && nx == destX) q = queue<pair<int, int>>(); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; cin >> startY >> startX; cin >> destY >> destX; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) cin >> adj[i][j]; bfs(startY, startX); cout << visited[make_pair(destY, destX)] << "\n"; return 0; }
-
해결됨코딩테스트 [ ALL IN ONE ]
leetCode - Two Sum 문제 Memory Limit Exceeded 에러
class Solution(object): def twoSum(self, nums, target): def backtrack(start, curr): # base case : 2개의 합을 더해서 target과 같으면 if len(curr) == 2 and sum(nums[i] for i in curr) == target: return curr # recursion : for i in range(start, len(nums)): curr.append(i) res = backtrack(i + 1, curr) if res: return res curr.pop() return None return backtrack(0, [])https://leetcode.com/problems/two-sum/submissions/1130560186/ 이 코드로 작성해서 leet-code의 two sum 문제에 제출해봤을 때 Memory Limit Exceeded 에러가 나는건 어떻게 해결해야 할까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
14번만 채점파일 없다는걸 미리 알려줬으면 좋겠어요
채점파일 찾느라 3번정도 다운로드 받고 찾아 해맸습니다.공유하는 파일에 설명을 같이 넣는다 던지 강의 끝까지 보기전에 미리 알게 했으면 더 편리 했을것 같습니다.
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
3강 누적합 11660 2차원 배열 문제
안녕하세요!강의영상과 백준 문제에서 입력 순서를 x1,y1,x2,y2 형식으로 입력을 받는데 이렇게 입력할 경우 결과가 반대로 나오는거 같습니다.ex. 1,2,1,2일 경우 2,1,2,1의 결과가 출력인덱싱을 graph[y][x] 형태로 진행하여 파생된 문제 같습니다.그러므로 입력을 y1,x1,y2,x2로 변경하거나 2차원 배열 인덱싱을 graph[x][y] 형태로 변경해야할 것 같습니다.제가 이해한게 맞나요?항상 좋은 강의해주셔서 감사드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
sstream에 있는 split()을 써도 되나요?
#include <sstream> #include <vector> int main() { std::string str = "1, 2, 3, 4, 5"; // str을 ,로 분리합니다. std::vector<std::string> tokens = split(str, ","); // 분리된 토큰을 출력합니다. for (const auto& token : tokens) { std::cout << token << std::endl; } } bard에 물어보니 string을 vector로 바꿔주는 split 함수가 있다고 하는데, 코딩 테스트 환경에선 이런 라이브러리를 사용 할 수가 없어서 함수를 외워서 써야하는건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 116페이지 Ralo구조체 출력 결과 질문입니다.
안녕하세요, 강의를 잘 듣고 실습 중 질문이 있습니다. 알고리즘 교안 116페이지 Ralo구조체 예제 코드 진행 시 출력물에 대한 질문입니다. #include <bits/stdc++.h> using namespace std; struct Ralo { int a, b; double c, d, e; }; void print(Ralo ralo) { cout << ralo.a << " " << ralo.b << " " << ralo.c << " " << ralo.d << " " << ralo.e << '\n'; } int main() { Ralo ralo = {1, 1, 1, 1, 1}; print(ralo); vector<Ralo> ret; ret.push_back({1, 2, 3, 4, 5}); ret.push_back({1, 2, 3, 4, 6}); ret.push_back({}); ret.push_back({1, 3}); for (Ralo ralo : ret) { print(ralo); } return 0; }위 예시에서 a, b의 자료형은 int이고 c, d, e 의 타입은 double라고 먼저 선언을 하게 되는데, main함수에서 출력 시 왜 일관되게 정수형으로 출력되는지 이해가 안됩니다.(형변환이 일어나야하거나, 타입 불일치에 따른 에러가 떠야 하는게 맞는거 아닌가요 ?!) 제가 부족한 개념이 많이 있을 수도 있으니 너그럽게 읽어주시면 감사하겠습니다. ^^;;
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-K 문제 틀린 로직인가요?
안녕하세요 큰돌선생님 매번 좋은강의와 코드 감사합니다강의와 수업을 복습하며 문제를 다시 풀어보았는데요, 제 처음 풀이는 플러드 필을 사용하면 깔끔하게 풀 수 있을것 같아서 적용하여 풀어보았는데, 문제의 예제조차 통과하지 못하여 그냥 새롭게 큐를 계속 새로 만들어서 하는 방식으로 수정하여 통과하였습니다. 근데 첫번째 접근방법의 로직에서 틀린부분이 없다고 생각하는데 혹시 어디가 틀린것인지 봐주실 수 있으신가요? 새롭게 미세먼지가 퍼지는 부분을 큐에 계속 담는 방식을 사용하였습니다. 첫번째 틀린 코드http://boj.kr/cdaa0817a0054c8aaa05db4a94fd4cc1 수정후 정답 코드http://boj.kr/48dc28720f1840d78af14656ac682d39