묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-H 메모리초과
http://boj.kr/8e44c6b66d4644008651ce44ab448ea8res.push_back(k); for (int i = prev[k]; i != n; i = prev[i]) { res.push_back(i); }이 부분으로 인해서 메모리초과가 발생하는 거 같은데 왜 발생하는지 이유를 잘 모르겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-L 질문있습니다
http://boj.kr/96d35c5b502442c08daba88212df08c4큰돌님 코드를 보니까 string 사용하신 부분 외에는 거의 동일한 것 같은데 자꾸 3%에서 틀렸다고 나와요.이유를 알 수 있을까요?
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
누적합 문제4 질문
안녕하세요,이 문제에서 prefix 를 만드실 때 처음부터 5*5 리스트를 만드셨는데 이 아이디어는 어떻게 떠올리신 건지 궁금합니다. 저 방식이 누적합 문제를 풀 때 일반적으로 사용되는 방식인가요?저같은 경우에는 4*4형식으로 만들어서 코드를 작성하였는데 이렇게 하니 답은 맞는데 시간 초과가 뜨네용 n, m = map(int, input().split()) box2 = [] for _ in range(n): box2.append(list(map(int, input().split()))) for i in range(n): for j in range(n): if i - 1 >= 0: box2[i][j] += box2[i - 1][j] if j - 1 >= 0: box2[i][j] += box2[i][j - 1] if i - 1 >= 0 and j - 1 >= 0: box2[i][j] -= box2[i - 1][j - 1] # 쿼리 처리 for _ in range(m): x1, y1, x2, y2 = map(int, input().split()) answer = box2[x2 - 1][y2 - 1] if x1 - 2 >= 0: answer -= box2[x1 - 2][y2 - 1] if y1 - 2 >= 0: answer -= box2[x2 - 1][y1 - 2] if x1 - 2 >= 0 and y1 - 2 >= 0: answer += box2[x1 - 2][y1 - 2] print(answer)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-I 질문있습니다.
투포인터를 하기 위해서 정렬을 사용하셨는데,문제를 읽어보면 '... a1, a2, ..., an으로 이루어진 수열이 있다. ... 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는'이라는 문구가 있어서, 정렬을 하게 되는 순간 기존의 index 순서가 바뀌기 때문에 함부로 정렬을 하면 안되는 문제 아닌가요?
-
해결됨코딩테스트 [ ALL IN ONE ]
노션 공유 부탁드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요!어제 점심때쯤 결제했는데 아직 노션 공유가 안되었습니다ㅠㅠ 빨리 부탁드립니다!!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
반례를 못찾겠습니다.
다음과 같이 선생님 코드를 참고하여 구현했는데 어디서 틀렸는지 모르겠습니다. http://boj.kr/ff14d895e1de44258e860f9df1dc81d9 그리고 수업을 들을 때 문제 풀이가 감도 안잡히면 해설을 조금 보고 풀이를 해본 다음에 그래도 안되면 코드를 참고해서 구현하는데 이런 방식으로 들어도 될까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
8-B 질문
안녕하세요 강사님, 코드 관련해서 질문이 있습니다.강사님께선 int &ret = dp[STR][INT]; if(ret != -1) return ret; 방식으로 코드를 작성하셨고,저는if (dp[strength][intelli] != -1) return dp[strength][intelli];방식으로 코드를 작성했습니다.그런데, 제 코드는 계속 오류가 납니다.어떤 부분에서 오류가 나는지 알려주시면 감사하겠습니다.http://boj.kr/4e74c937e8b440c3989b1cfcceb69f53
-
해결됨코딩테스트 [ ALL IN ONE ]
교재 문의드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의소개에 ( 한 권으로 끝내기! 195페이지 분량 ) 이라는 교재가 제공된다고 되어있는데, 이게 노션으로 공유되는 교재인가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안에 제시된 string - split()의 효율성 관련 질문드립니다.
안녕하세요, 큰돌님!교안에서 제시된 내용을 기반으로 알고리즘 문제를 풀다가 궁금한 부분이 생겨 질문드렸습니다.교안에서 제시된 문자열 - split 함수는 아래와 같습니다.vector<string> split(string input, string delimiter) { vector<string> ret; long long pos = 0; string token = ""; while((pos = input.find(delimiter)) != string::npos) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + delimiter.length()); } ret.push_back(input); return ret; }저는 위 함수를 응용하거나 문제를 해결하는데, 오늘 백준의 5430번 문제를 해결할 때도 위와 같은 로직의 코드를 작성하여 문자열 split을 시도하였습니다.// I-2. 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. cin >> _p; // I-3. 다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. cin >> _n; // I-4. 다음 줄에는 [x1, ... xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. cin >> _x; string origin = _x.substr(1, _x.size() - 2); vector<string> vs_x(_n); if(origin.empty()) { } else { int pos = 0; int cycle = 0; while((pos = origin.find(',')) != string::npos) { string tmp = origin.substr(0, pos); vs_x[cycle++] = tmp; origin.erase(0, pos + 1); } vs_x[cycle] = origin; } 코드에 대해 부연설명을 드리자면, 입력을 통해 문자열을 받게 되면, 해당 문자열의 첫번째와 마지막 인덱스를 제외한 문자열을 origin에 저장한 후, 이 문자열 origin을 컴마(,)를 기준으로 split 하였습니다. 예를 들어, [1, 2, 3]이라는 문자열을 입력(_x)으로 받았다면, 변수 origin에 1,2,3을 저장한 후 컴마를 기준으로 문자열을 split할 수 있습니다.하지만, 위 코드와 함께 문제를 해결하고자 할 때, 지속적으로 시간 초과 문제가 발생하였습니다. 따라서 split 함수를 다음과 같은 로직으로 변경한 후 답안을 다시 제출하였으며, 그 결과 시간 초과가 발생하지 않고 문제를 해결할 수 있었습니다.// I-2. 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. cin >> _p; // I-3. 다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. cin >> _n; // I-4. 다음 줄에는 [x1, ... xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. cin >> _x; string token = ""; vector<string> vs_x(_n); int cycle = 0; for(int j = 0; j < _x.length(); ++j) { if(isdigit(_x[j])) { token += _x[j]; } else { if(!token.empty()) { vs_x[cycle++] = token; token = ""; } } } 제가 궁금한 것은 위에 제시된 split에 대한 두 개의 로직이 왜 효율성 차이가 나는지 잘 모르겠습니다.. origin.erase(0, pos + 1)이 O(n)의 시간 복잡도를 요구하면서, 첫 번째 로직은 O(n^2)의 시간 복잡도와 두 번째 로직은 O(n)의 시간 복잡도를 필요로 할 수도 있겠다는 생각이 들기도 하지만, 정확하게 어떤 부분이 큰 차이를 불러 일으키는지 잘 모르겠습니다. 감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-A 질문있습니다
http://boj.kr/b8eaa84254ba4993b722f0482d6c1280조합 함수를 다음 요소를 선택한다, 안한다로 나눠 뻗어나가도록 재귀를 구현하였습니다..1개를 택할 때는 따로 구해주었는데 어떤 걸 놓친 걸까요?테스트케이스는 모두 통과하였는데 오답입니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-A 오답 관련 질문입니다. (to_string 사용 시)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의 잘 듣고 있습니다!!해당 문제를 푸는데, 이해가 되지 않는 현상이 있어 질문드려요 비트마스킹으로 조합을 획득하여 이를 다시 순번으로 복원하는 과정에서 ret += to_string(j+1); 로 하니 오답이 발생했습니다.무엇이 문제일지 전혀 감을 못잡다가..,ret += (char(j+1) +'0'); 으로 해주니 정답 처리가 되었는데요 그 이유가 무엇일지 궁금합니다.감사합니다. 전체 코드 >> #include <bits/stdc++.h> using namespace std; int N; int mp, mf, ms, mv; vector<vector<int>> m; int main() { cin >> N; cin >> mp >> mf >> ms >> mv; m = vector<vector<int>>(N, vector<int>(5, 0)); for (int i = 0; i < N; ++i) { for (int j = 0; j < 5; ++j) { cin >> m[i][j]; } } /* 0000000: 0 0000001: 1 0000010: 2 0000011: 3 ... */ int min_C = 500 * 200; vector<string> ans; for (int i = 0; i < (1 << N); ++i) { int sum_p = 0, sum_f = 0, sum_s = 0, sum_v = 0, sum_c = 0; for (int j = 0; j < N; ++j) { // 비트 마스킹을 통한 조합 combination 획득 if (i & (1 << j)) { sum_p += m[j][0]; sum_f += m[j][1]; sum_s += m[j][2]; sum_v += m[j][3]; sum_c += m[j][4]; } } if (sum_p >= mp && sum_f >= mf && sum_s >= ms && sum_v >= mv) { if (min_C > sum_c) { min_C = sum_c; string ret = ""; for (int j = 0; j < N; ++j) { if (i & (1 << j)) { // ret += to_string(j+1); << 오답 ret += (char(j + 1) + '0'); // << 이렇게 해주니 비로소 정답 } } ans = {ret}; } else if (min_C == sum_c) { string ret = ""; for (int j = 0; j < N; ++j) { if (i & (1 << j)) { // ret += to_string(j+1); << 오답 ret += (char(j + 1) + '0'); // << 이렇게 해주니 비로소 정답 } } ans.push_back(ret); } } } if (ans.empty()) cout << -1; else { cout << min_C << "\n"; sort(ans.begin(), ans.end()); for (char s : ans[0]) { cout << int(s - '0') << " "; } } return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-M 질문 드립니다!
스택 말고 vector를 이용해서 이렇게 풀었는데 꼭 스택을 사용 해야 하는 건가요??#include <iostream> #include <vector> using namespace std; int n; int cnt = 0; int main() { cin >> n; for (int i = 0; i < n; i++) { string s; cin >> s; vector<char> arr; for (int j = 0; j < s.length(); j++) { if (arr.empty() || arr.back() != s[j]) { arr.push_back(s[j]); } else { arr.pop_back(); } } if (arr.empty()) cnt++; } cout << cnt; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1주차 개념#7에서 재귀함수의 시간복잡도를 구할 때 메인 로직은 어떤 기준으로 결정하는건가요?
안녕하세요.재귀함수의 시간복잡도를 구할 때 (메인로직)*(함수호출횟수)라고 알려주셨는데, 여기에서 메인 로직은 어떤 기준으로 결정되는건가요?감사합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
반례를 못찾겠습니다.
http://boj.kr/7b036ef3742940cd860da4b66f630c0b 이론에서 배웠던 코드를 이용해서 구현했는데 어디서 틀렸는지 못찾겠습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
문제를 풀다가 정수 관련하여 질문이 생겼어요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. cin >> N >> K; queue<int> q; q.push(N); // visited[N] += 1; NK = K + 1; cout << K << N;이렇게 하면 -1 -1을 입력했을 때 -1 -1이 잘 출력되는데 주석을 지우고 실행하면 0 -1이 출력되는 현상이 발생합니다.. #include <bits/stdc++.h> using namespace std; int N, K, visited[500004], prevN, searchTime = 0, flag = 0; int NK = 0; int main() { cin >> N >> K; queue<int> q; q.push(N); // visited[N] += 1; NK = K + 1; cout << K << N; }
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
백준 2178 미로탐색 질문 입니다.
안녕하세요.. 질문부터 말씀드리면,중첩 for문을 돌면서 입력값을 받을때, i는 y축, j는 x 축으로 알고있는데 bfs 호출 후 상하좌우 탐색 시, now의 0번째 값을 왜 x로 보시는지 알고싶습니다.. y가 아닌지... 짧은 지식으로 생각할때는 그런거 같아서요 ㅎㅎ 모든 2차원배열[][]은 y, x가 아닌건가요? ㅠㅠ 맨붕오네요 ㅋ
-
미해결입문자를 위한 코딩테스트 핵심(이론과 문제풀이) [Python]
배열리스트 문제 5번 <중복 제거> 질문입니다.
안녕하세요!~배열리스트 문제 5번 <중복 제거> 질문입니다.for i in range(1, len(nums)): 이후 조건문에서선생님께서 알려주신 직전항과의 값이 같은지 비교하는거 말고,if nums[i] not in answer:answer.appendleft(nums[i]) 이런식으로 코드를 작성하게 되면 시간 효율에서 문제가 생기게 될까요? 아무래도 nums 크기마다 한 번씩 answer 전체를 탐색해야해서 효율이 더 떨어질 것 같긴한데 궁금해서 질문드려봅니다! 감사합니다.
-
미해결자바 코딩테스트 - it 대기업 유제
바둑대회 질문입니당
안녕하세요! 강의 잘 듣고있습니다! 바둑대회 문제 관련해서 제가 풀어낸 방식은 흑돌팀과 백돌팀 각각 인원을 세어주는 배열과 팀능력치를 계산하는 배열 두 개를 선언하고, 깊이가 다 다랐을 때 정답을 계속해서 초기화하는 방식을 사용했습니다. 예제 코드에서는 문제가 따로 생기진 않았는데 혹시 이런 방식의 풀이도 다른 문제를 접근하는게 큰 문제가 없을지 그리고 다른 입력에도 문제가 없을지 궁금합니다.package DFS; package DFS; import java.util.*; public class 바둑대회 { } class Solution6 { static int[] sum; static int[] teamCount; static int[][] cansArr; static int minNumber; static ArrayList<Integer>[] list; public static int solution(int[][] cans){ int answer; sum = new int[2]; teamCount = new int[2]; cansArr = cans; minNumber = Integer.MAX_VALUE; list = new ArrayList[2]; for (int i = 0; i < list.length; i++) { list[i] = new ArrayList<>(); } DFS(0); answer = minNumber; return answer; } public static void DFS(int lv){ if(lv == cansArr.length){ if(Math.abs(sum[0] - sum[1]) < minNumber){ minNumber = Math.abs(sum[0] - sum[1]); } return; } for (int i = 0; i < 2; i++){ if( teamCount[i] < cansArr.length/2 ){ sum[i] += cansArr[lv][i]; teamCount[i]++; DFS(lv+1); sum[i] -= cansArr[lv][i]; teamCount[i]--; } } } public static void main(String[] args){ Solution6 T = new Solution6(); System.out.println(T.solution(new int[][]{{87, 84}, {66, 78}, {94, 94}, {93, 87}, {72, 92}, {78, 63}})); System.out.println(T.solution(new int[][]{{10, 20}, {15, 25}, {35, 23}, {55, 20}})); System.out.println(T.solution(new int[][]{{11, 27}, {16, 21}, {35, 21}, {52, 21}, {25, 33},{25, 32}, {37, 59}, {33, 47}})); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-I 지문 문제
http://boj.kr/ea0856e69f854bb9afee8490ed73794d 코드의 질문은 아닙니다.. 지문의 (하지만 하나의 파닭에는 하나 이상의 파가 들어가면 안 된다.) 라는 부분을 읽고 파는 무조건 나뉘어져야 한다. 라고 생각하고 조건을if(temp>mid)으로 달았었거든요 어디서 틀렸나 강의 봤는데if(temp>=mid) 였더라구요이렇게 되면 파를 통째로 사용하게 되는 경우도 생겨 오답인 것이 아닌가요?코드 질문은 아니여서 올릴까 말까 하다가.. 찜찜해서 질문드립니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-A 치킨 배달 시간초과 관련 질문 입니다!
http://boj.kr/5b5feb84a65f44c19188df5fbe697fe6선생님의 풀이와 크게 다르지 않은거 같은데 어디서 시간초과가 나는지 잘모르겠습니다...