묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p136 질문있습니다
안녕하세요. 교안 p136 예제 코드에서#include <bits/stdc++.h> using namespace std; struct Point { int y, x; }; struct cmp { bool operator()(Point a, Point b) { return a.x < b.x; } }; priority_queue<Point, vector<Point>, cmp> pq; int main() { pq.push({1, 1}); pq.push({2, 2}); pq.push({3, 3}); pq.push({4, 4}); pq.push({5, 5}); pq.push({6, 6}); cout << pq.top().x << "\n"; return 0; }operator가 오버로딩 된 것까진 알았는데 그럼 operator()는 ()라는 연산자를 오버로딩 한 것인가요..??()라는 연산자는 무슨 의미를 가진 건가요..? ㅜㅜ 설명해주시면 감사하겠습니다.priority_queue<Point, vector<Point>, cmp> pq;그리고 이렇게 priority_queue를 선언할 때 인자가 세개 들어가는 게 각각 무슨 의미인지 설명해주실 수 있나요..? 검색을 해도 언급되는 부분을 못 찾겠어서요ㅜㅜ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-R 질문있습니다..
http://boj.kr/e351fd164d5943d29c80fef4e6fb27d6자식노드를 담아주는 인접 리스트를 만들고,cut함수로 잘라낸 노드와 그 자식들을 dead체크를 해주었습니다. 그리고 남은 트리에 관하여, dead 체크와 자식 체크를 해주어 리프 노드를 구해봤는데 무엇이 잘못된 것일까요 ...
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-J 질문
http://boj.kr/a4d6ba76bf2f4964a2ffaccf343ffaa9주난이를 기준으로 퍼져나가면서 0이면 queue에 넣고 1이면 배열에 넣어두었다가 0으로 바꿔주는 방법을 사용했는데 어디서 틀린건지 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p131 질문 있습니다
안녕하세요 큰돌님 😀교안 p131의 'x를 1순위로 오름차순으로 정렬하고 y가 2순위로 내림차순 z가 3순위로 오름차순 정렬이라는 문제'의 예제 코드에서struct Point { int x, y, z; Point(int y, int x, int z) : y(y), x(x), z(z) {} Point() { y = -1; x = -1; z = -1; } bool operator<(const Point &a) const { if (x == a.x) { if (y == a.y) return z < a.z; // 3순위 : z가 오름차순 return y > a.y; // 2순위 : y가 내림차순 } return x < a.x; // 1순위 : x가 오름차순 } };operator< 오버로딩 부분에서 오름차순, 내림차순이 어떻게 정해지는 것인지 정렬 로직이 궁금합니다.검색해보았더니 operator< 가 Point 내부에서 자체적으로 정렬을 시킨다고 했는데,그럼 operator< 매개변수로 들어오는 a가 어떻게 들어오게 되고 정렬을 어떻게 시키는 건지 이해가 안갑니다..ㅜㅜ예를 들어서 Point의 지역변수 x, y, z와 a의 x, y, z를 비교했을 때, x < a.x가 false이면 자리를 바꾸는 것인가요..?ㅠㅠ 로직 자체가 이해가 안 갑니다. 그리고 Point 구조체를 만드실 때 변수를 y, x 순으로 받으시는 것도, 이렇게 하면 더 편리한 이유가 있는건지 질문드리고 싶습니다!감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
질문 있습니다.
http://boj.kr/4ff659025d334003940b3c0246e40c58카운트를 할 때 인덱스 0에 A카운트, 1에 B카운트 .. 진행을 해서 구현했습니다.if(mid) { answer.insert(answer.begin() + answer.size() / 2, mid + 'A'); } 하지만 mid값을 중앙에 넣을 때 조건문에서 문제가 있는데 예를 들어 AAAAA를 넣으면 결과값으로 AAAA가 나옵니다.홀수 알파벳이 A일 때 조건문에 들어가지를 못해서 하나가 빠지는 것 같은데.. 인덱스 1일 때 A 카운트, 2일 때 B 카운트 하는 방식으로 해결할 수는 있지만 다른 방법은 없을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2240번 자두나무 질문있씁니다!
안녕하세요 선생님! 제가 이해하는 것이 맞나 싶어서 여쭤보고자 질문올립니다!Q1.밑에 이부분에서는 go(0,1,m-1)같은 경우와 go(0,0,m)는 완탐 시 처음 시작하자마자 움직이는 경우에 수를 나누어서 쭉쭊죾 한다음에 max값을 찾기 위해 구현한 것이 맞을까요?cout << max(go(0, 1, m - 1), go(0, 0, m)) << '\n'; Q2.밑에 이 부분에서 ret을 참조자로 받아서 반환하는 이유가 혹시 있을까요? 참조자를 사용하지 않으면 시간초과가 나더라구요.. 참조자를 통해서 직접 적으로 dp배열의 값을 참조하면 메모리를 효율적으로 쓸수 있어서 그런건가여? 근데 또 궁금하게 int &ret을 계속 생성하는건데.. 조금 햇갈립니다..ㅠint &ret = dp[idx][tree][cnt]; if(~ret) return ret; Q3.이 부분은 현재의 index에서 다음 인덱스로 갈떄 옆에 트리로 가는경우 안가는경우나눠지는 것으로 해석하였습니다. 그런데 뒤에 go함수 같은경우는 나무이동을 안할떄로 알고 있씁니다. 뒤에 (tree ==b[idx]+1) 같은 경우는 다음 go로 넘어가기 전 현재의 위치에 tree와 그 시간대 tree에 위치가 같으면 +1 (idx시간 떄 자두를 받았기 떄문) 아니면 0을 더하는 것 이 맞나요?!?return ret = max(go(idx + 1, tree^1, cnt - 1), go(idx + 1, tree, cnt)) + (tree == b[idx] - 1);Q4. 이건 문제와 외람된 말이긴 합니다. 지금 매 주차 개념설명 들으며 2~3문제 씩 주차 문제 풀면서 다음 주차 개념을 빠르게 듣고 있습니다. 과정이 너무 어려운데 이해가 안되면 문제를 외우기보다는 그 과정이 어떤식으로 대처해야하는지 위주로 공부하고 있습니다. 잘하고있는걸까여ㅠ,,
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7_A 2분 쯤 설명이 이해가 안됩니다.
코드를 아무리 봐도 DP에 넣은 값들이 여태까지 지나온 경로들의 최적해가 아니라 visited에 포함되지않은 남은 경로들의 최적해 인거같아요.... 설명에서는 앞에서부터 쌓아가는거 처럼 설명하시는데( (a b c)든 (a c b)든 최적의 값을 구해서 d로 가면 되는거아니냐는 부분) 제가 이해를 잘못 한건가요???
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4분 54초에 combi 외우라고 어디에서 말씀 하셨나요?
블로그 완탐 글 읽는데 이문제에서는 왜 visited 처리 안하셨는지 궁금합니다! 아 그리고 combi(-1,v)로 시작하셨던데 start +1 안하고 그냥 combi(0,v)로 하면 안되나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p131 3개의 멤버변수 정렬하기
해결되었습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-H 질문있습니다.
while(e<n){ if(cnt[a[e]]==0){ cnt[a[e]]++; e++; } else{ ret+=(e-s); cnt[a[s]]--; s++; } }강사님 안녕하세요?else문에서 cnt[a[s]]-- 대신 cnt[a[e]]--로 하면 틀리는 이유를 모르겠습니다. 어차피 a[s]랑 a[e]는 똑같은 값이어서 어떤 것을 줄여도 맞아야하는거 아닌가요?http://boj.kr/b07dba8700854c70b5f4031fbd5239c1
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-L 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님http://boj.kr/cd54b57de0df4ce294ae9ff069c83984next를 변수를 선언하는 것과 다음과 같이 코드를 작성하는 것에 왜 값이 다르게 출력이 되는지 여쭤보고 싶습니다. 제 코드를 돌리면 이렇게 나와요!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[5-L] 브루트포스 방법 문의드립니다...!
https://www.acmicpc.net/source/73585978 시간초과가 발생하는데, 어느 부분을 수정해서 복잡도를 줄여야할지 잘 모르겠어요..!dfs를 실행하는 반복문을 절반으로 줄이는 방식으로 해야할까요...?
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
4번 나이차이 문제
#include <iostream> using namespace std; int main() { int n,a; int max = 0; int min = 0; cin >> n; for (int i = 1; i <= n; i++) { cin >> a; if (a > max) { max = a; } if (a < min) { min = a; } } cout << max - min; return 0; }이렇게 했을 때 값이 제대로 나오지 않습니다.초기화 부분에서 max와 min에 0을 넣으면 왜 값이 다르게 나오나요..?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-A
와.. 일단 저는 다른 방법으로 풀었는데제가 푼 방식으로의 접근에 익숙해지면 더 난이도 높아지는 그리디 문제는 대처를 못하겠죠? ㅠ..큰돌님 로직이 큰 가격만 남게되는건 쉽게 이해했는데if(pq.size() > v[i].first)이 코드 하나로 큰 가격 + 하나의 날짜에 하나만 꽂기가가능해지는것에 이마를 탁 치고 갑니다... 그래도 제 코드 한번 봐주시고 피드백 한번 주시면 감사하겠습니다.저는가격으로 내림차순 sort한다.visited[10004]를 만들어놓는다.가장 큰 가격부터 자신의 Day에 visited[Day] = true로 해준다.만약 자신의 Day에 visited[Day]가 이미 true라면Day-1부터 1일까지 visited[]가 false일 날을 찾아 거기에 넣어준다.(찾았으면 break)이 로직으로 풀었습니다!https://www.acmicpc.net/source/73577847
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-B 누적합에서 보는 이득이 클까요?
http://boj.kr/e1c4b7529c7d4925bb95b0e38d7aec56처음에는 1~10억으로 이분탐색을 했었는데요시간초과가 나서 배열에 있는 값들을 더하고 확인하는 시간이 오래 걸리나 싶어서 누적합으로 해서 풀었는데 큰 차이는 없었습니다. 못풀어서 결국 강의 봤는데if (mx > mid) return false; 부분을 보고 감탄을 금치 못했는데요..누적합으로 바꿨을 때 답이 아니었던게 좀 충격이었던지라누적합을 이런 용도로 사용하는 것이 아닌가?라는의문이 들기도 하고 .. 누적합의 퍼포먼스를 최대로 낼 수 있는 문제가 막 떠오르지가 않아서 잘 이해하고 있는지 의문이 들어 글 남겨봅니다 ㅜㅜ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
투포인터 없이 풀어 봤는데 반례라거나 시간복잡도의 문제가 있을까요...?
function isSame(map1, map2) { if (map1.size !== map2.size) return false; for (const [key, val] of map2) { if (!map1.has(key) || map1.get(key) !== val) return false; } return true; } function solution(s, t) { let answer = 0; const map1 = new Map(); const map2 = new Map(); const n = t.length; const ss = s.slice(0, n); for (const s of t) { if (map1.has(s)) { map1.set(s, map1.get(s) + 1); } else { map1.set(s, 1); } } for (const s of ss) { if (map2.has(s)) { map2.set(s, map2.get(s) + 1); } else { map2.set(s, 1); } } if (isSame(map1, map2)) answer++; for (let i = n; i < s.length; i++) { map2.delete(s[i - n]); map2.set(s[i], map2.get(s[i]) ? map2.get(s[i]) - 1 : 1); if (isSame(map1, map2)) answer++; } return answer; } const s = "bacaAacba"; const t = "abc"; console.log(solution(s, t)); 슬라이딩 윈도우로 처음 t만큼 잘라서 비교한 이후 부터 돌면서 처리 했는데 다른 문제가 있을까요...?
-
해결됨자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
section5 - 7번 질문 드립니다.
function solution(words1, words2) { const firstWordMap = new Map(); const secondWordMap = new Map(); let answer = "YES"; // 단어 구성 문자열 판별 for (let item of words1) { if (firstWordMap.has(item)) { firstWordMap.set(item, firstWordMap.get(item) + 1); } else { firstWordMap.set(item, 1); } } for (let item of words2) { if (secondWordMap.has(item)) { secondWordMap.set(item, secondWordMap.get(item) + 1); } else { secondWordMap.set(item, 1); } } // 아나그램 판단 for ([key, value] of firstWordMap) { if (secondWordMap.has(key) && secondWordMap.get(key) === value) { answer = "YES"; } else { return "NO"; } } return answer; } // test case console.log(solution("AbaAeCe", "baeeACA")); console.log(solution("abaCC", "Caaab")); 위와 같이 map을 두개 만들어 비교하는 방법은 별로일까요?
-
미해결자바 코딩테스트 - it 대기업 유제
5. "최대 길이 바이토닉 수열" 에서 설명해주신 방법과 제가 직접 구현한 방법이 달라, 확인 한번 부탁드립니다
안녕하세요 수업 강의를 보다가, 풀어주신 방법이 저와 다르고 for 문 하나만으로 해결이 가능하지 않나 싶어서 확인차 질문 드려봅니다.pdf 상의 정답은 모두 맞춘 상태입니다. 간단하게 하라도 피드백 주신다면 감사합니다class Solution5 { public static int solution(int[] nums){ // answer : 정답 // len : 현재 수열 길이 // d : 현재 수열의 방향 ( 0: 증가, 1: 감소) // prevNum : 이전 숫자 int answer = 0, len = 0, d = 0, prevNum = Integer.MIN_VALUE; for (int num : nums) { if (d == 0) { // 1. 현재 수열이 증가하고 있는 상황 // 2. 수열이 증가하고 있는 상황에서의 시뮬레이션 if (prevNum > num) { // 이전 숫자보다 작을 경우, 수열의 방향을 감소로 변경 d = -1; } else if (prevNum == num) { // 이전 숫자와 값이 같을 경우, 바이토닉 수열이 아니므로 길이 초기화 len = 0; } // 길이 증가 len++; } else { // 1. 현재 수열이 감소하고 있는 상황 // 2. 수열이 감소하고 있는 상황에서의 시뮬레이션 if (prevNum > num) { // 2-1. 이전 숫자보다 작을 경우, 길이 증가 len++; } else { // 2-2. 이전 숫자보다 크거나, 같을 경우 수열이 끝났다고 판단 // 2-2-1. 현재까지의 길이를 계산하여 더 길면 정답으로 변경 if (answer < len) { answer = len; } // 2-2-2. 초기화 len = 1; // 현재 숫자부터 다시 시작하므로 값은 1 d = 0; // 2-2-3. 현재 숫자 이전의 값을 비교했을 때, 증가하고 있었다면 길이 하나 증가 if (prevNum < num) { len++; } } } prevNum = num; } // 현재 진행중이던 수열이 감소하고 있고 길이가 정답보다 크다면, 정답으로 변경 if (answer < len && d == -1) { answer = len; } return answer; } public static void main(String[] args){ Solution5 T = new Solution5(); System.out.println(Solution5.solution(new int[]{1, 2, 1, 2, 3, 2, 1})); System.out.println(Solution5.solution(new int[]{1, 1, 2, 3, 5, 7, 4, 3, 1, 2})); System.out.println(Solution5.solution(new int[]{3, 2, 1, 3, 2, 4, 6, 7, 3, 1})); System.out.println(Solution5.solution(new int[]{1, 3, 1, 2, 1, 5, 3, 2, 1, 1})); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 시간초과 & 학습 방법 고민있어요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의 잘 듣고 있습니다.강의를 참고하여 풀었는데. 시간초과가 뜹니다#include <bits/stdc++.h> using namespace std; int R, C; vector<vector<char>> lake; queue<vector<int>> candidates_Swan, candidates_SwanTemp; queue<vector<int>> candidates_Water, candidates_WaterTemp; vector<vector<int>> delta = {{-1,0},{1,0},{0,-1},{0,1}}; vector<vector<int>> visitedSwan, visitedWater; bool moveSwan(){ while(candidates_Swan.size()){ vector<int> now = candidates_Swan.front(); candidates_Swan.pop(); for(auto d : delta){ int next_i = now[0]+d[0]; int next_j = now[1]+d[1]; if (next_i >= 0 && next_j >= 0 && next_i < R && next_j < C){ if (visitedSwan[next_i][next_j] == 0){ visitedSwan[next_i][next_j] = 1; if (lake[next_i][next_j] == '.'){ candidates_Swan.push({next_i, next_j}); } else if (lake[next_i][next_j] == 'X'){ candidates_SwanTemp.push({next_i, next_j}); } else if (lake[next_i][next_j] == 'L') return true; } } } } return false; } void waterMelting(){ while(candidates_Water.size()){ vector<int> now = candidates_Water.front(); candidates_Water.pop(); for(auto d : delta){ int next_i = now[0] + d[0]; int next_j = now[1] + d[1]; if (next_i >= 0 && next_j >= 0 && next_i < R && next_j < C){ if (visitedWater[next_i][next_j] == 0){ if (lake[next_i][next_j] == 'X'){ candidates_WaterTemp.push({next_i, next_j}); visitedWater[next_i][next_j] = 1; lake[next_i][next_j] = '.'; } } } } } return; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> R >> C; lake = vector<vector<char>>(R, vector<char>(C)); visitedSwan = vector<vector<int>>(R, vector<int>(C,0)); visitedWater = vector<vector<int>>(R, vector<int>(C,0)); for(int i = 0 ; i < R ; ++i){ string s; cin >> s; for(int j = 0 ; j < C; ++j){ lake[i][j] = s[j]; if (lake[i][j] == 'L' && candidates_Swan.empty()){ candidates_Swan.push({i,j}); // 백조는 한마리 위치에서만 시작 visitedSwan[i][j] = 1; } if (lake[i][j] == 'L' || lake[i][j] == '.'){ candidates_Water.push({i,j}); visitedWater[i][j] = 1; } } } int day = 0; while(true){ if (moveSwan()) break; waterMelting(); // cout << endl; // for(auto ll : lake){ // for(auto l : ll) cout << l; // cout << endl; // } // cout << endl; candidates_Swan = candidates_SwanTemp; candidates_Water = candidates_WaterTemp; candidates_WaterTemp = queue<vector<int>>(); candidates_SwanTemp = queue<vector<int>>(); day++; } cout << day << "\n"; return 0; } 강의를 듣기 전에 먼저 문제를 풀고 강의를 듣는 방식을 고수하고 있는데, 한 문제를 푸는데 점점 시간이 늘어나 두시간 정도를 써야 겨우 한문제를 풀고 있습니다.이런 방식을 고수하는것이 좋을지,어떻게 해야하나 질문드려요. 감사합니다. ^^
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
질문있습니다.
http://boj.kr/0aeaba2d60a745ba87e41316d0804d89위 코드를 디버깅 해보면 v.clear()를 실행 시킨 후 dfs함수로 들어가서 v.push_back()을 하면 오류가 발생합니다.오류:"Unhandled exception thrown: read access violation._Pnext was 0x8."왜 이런 오류가 발생하는지 궁금합니다. 해결방안도 알고 싶습니다.