묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-H 비트마스킹 질문 있습니다.
안녕하세요, 강의 잘 듣고 있습니다.문제를 읽고, 스스로 짜보고 있습니다.그런데 비트마스킹 부분에서 제가 생각한 것처럼 동작하지 않아 무슨 부분이 문제인지 궁금합니다.아무리 print를 찍어서 찾아보려고 해도 찾지 못해 질문드립니다. 문제 부분// DFS 함수 (18, 19번째 줄)if(a[y][x] & (1 << i)) continue;_ret += dfs(ny, nx); http://boj.kr/b423ee8869844758a31b0c3c5d67fd49
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
vector 순회중 삽입/삭제 해결법에 대해 질문드립니다
강의 정말 잘듣고 있습니다!! vector 순회중에 데이터 삽입/삭제가 일어나면 크래시가 난다는건 이해했습니다!근데 이를 스마트 포인터를 사용하거나 생포인터에 아이디 방식을 사용하여 아이디로 상대가 살아있는지 확인하는 법이 있다고 하셨는데 스마트 포인터로는 어떻게 해결이 되는지 정확히 이해가 되지 않아 질문드립니다. 아무래도 스마트 포인터를 사용하고 vector 에 들어있는 스마트 포인터는 생존해있다는게 보장이 되기 때문에 맘편히 사용해도 된다는 것 때문에 해결이 되나 생각을 해보았습니다. vector<shared_ptr<int>> v;void Test1(){shared_ptr<int> d = make_shared<int>();*d = 4;v.push_back(d);} void Test2(){v.pop_back();} int main(){ {shared_ptr<int> a = make_shared<int>();shared_ptr<int> b = make_shared<int>();shared_ptr<int> c = make_shared<int>();*a = 1;*b = 2;*c = 3;v.push_back(a);v.push_back(b);v.push_back(c);} vector<shared_ptr<int>>& temp = v;for (auto& asd : temp){Test2();cout << *asd << endl;} } 하지만 이렇게 테스트를 해본 결과 삽입할때는 크래시, 삭제할때는 날라간 쓰레기 값을 사용합니다. 당연히 제가 뭔가를 잘못 생각하고 있겠지만 고민하다가 답이 나오질 않아 질문 드립니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p176 질문 드립니다
안녕하세요 큰돌님 😀 교안 p176에 10진법을 2진법으로 바꾸는 코드에서#include <bits/stdc++.h> using namespace std; vector<int> v; int main() { int n = 100; int b = 2; while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때 reverse(v.begin(), v.end()); for (int a : v) { if (a >= 10) // 이 조건은 16진법 변환을 위해 필요함. { cout << char(a + 55); // char(a + 55)에서 a가 10이면 char(65)가 되서 'A'가 된다. } // 16진법은 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}로 표현하는 방법 else { cout << a; } } return 0; }while문에서 조건을 n > 1로 하신 이유가 궁금합니다!while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때이 부분을while (n >= 1) { v.push_back(n % b); n /= b; }이렇게 바꾸면 문제가 생길까요?? 제가 n에 여러 값을 넣어봤을 땐 문제가 없었는데 반례가 있다면 알려주시면 감사하겠습니다!
-
해결됨[게임 프로그래머 도약반] DirectX11 입문
루키스님 질문 있습니다
1. 클래스 생성자 매개변수가 레퍼런스인 스타일은 Init()으로 데이터를 초기화 하는 스타일보다불편하다고 생각을 하는데(레퍼런스 때문에 헤더파일에 선언만 하는게 힘들다던지) 제 생각이 맞나요? 어떤 것이 표준에 가깝나요? 2. 저만의 게임 엔진을 구축하는게 목표라서 코드를 적으면서 했습니다만 난이도가 너무 높아서 좌절했습니다개인적으로 DirectX를 이해하는것보다 전체적인 소스 아키텍처가 더 어려웠습니다이 정도 소스 난이도는 프로그래머라면 쉽게 이해 가능한 수준인건가요? 아니면 어려운게 맞는건가요?그리고 게임 엔진을 만들려고 한다면 이 강의 이후 게임 엔진 아키텍쳐 책이나 디자인 패턴을 열심히 공부하는 방향이 맞을까요? 3. 루키스님의 소스를 참고해서 게임 엔진을 구축하고 그 엔진을 이용해서 간단한 게임을 만든다면저작권 부분이 어떻게 될지 궁금합니다 질문이 많아서 죄송합니다 좋은 강의에 항상 감사하게 생각하고 있습니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
메모리 초과가 나는데 선생님 코드와 어디가 다른지 모르겠습니다..ㅠㅠ
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <queue> #include <string> #include <math.h> #include <cstring> #include <stack> using namespace std; int arr[3] = {}; int dmg[6][3] = { {1,3,9},{1,9,3},{9,1,3}, {9,3,1},{3,1,9},{3,9,1} }; int visited[64][64][64] = {}; struct A { int a; int b; int c; }; queue<A> mq; void BFS() { while (!mq.empty()) { int x = mq.front().a; int y = mq.front().b; int z = mq.front().c; mq.pop(); if (visited[0][0][0]) { break; } for (int i = 0; i < 6; i++) { int nx = x - dmg[i][0]; if (nx < 0) { nx = 0; } int ny = y - dmg[i][1]; if (ny < 0) { ny = 0; } int nz = z - dmg[i][2]; if (nz < 0) { nz = 0; } if (visited[nx][ny][nz] != true) { mq.push({ nx,ny,nz }); visited[nx][ny][nz] = visited[x][y][z] + 1; } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; cin >> N; for (int i = 0; i < N; i++) { cin >> arr[i]; } mq.push({ arr[0],arr[1],arr[2] }); visited[arr[0]][arr[1]][arr[2]] = 1; BFS(); cout << visited[0][0][0]-1; } 메모리 초과가 나는데 아무리 봐도 어디가 나는지 모르겠습니다ㅜㅜ..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
멘토링 신청 질문
혹시 이번에 올라온 Live 강의 신청이 안되는거 같은데 자리가 꽉차서 그런건가요??
-
미해결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%에서 틀렸다고 나와요.이유를 알 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-I 질문있습니다.
투포인터를 하기 위해서 정렬을 사용하셨는데,문제를 읽어보면 '... a1, a2, ..., an으로 이루어진 수열이 있다. ... 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는'이라는 문구가 있어서, 정렬을 하게 되는 순간 기존의 index 순서가 바뀌기 때문에 함부로 정렬을 하면 안되는 문제 아닌가요?
-
해결됨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
-
미해결홍정모의 따라하며 배우는 C++
const와 extern
안녕하세요const가 변수의 외부연결을 막는 것 같은 상황이 생기는 거 같아 이렇게 여쭤봅니다. 파일구조는 vars.cpp -> header.h -> main.cpp&test.cpp입니다.vars.cppheader.hmain.cpptest.cpp의도한대로 잘 작동하며 출력화면은 아래와 같습니다.그런데 여기서 vars.cpp에서 nmsp_a변수를 int에서 const int형으로 바꾸고,header.h에서도 nmsp_a를 extern int에서 extern const int형으로 바꾸고 돌려보면아래와 같이 오류가 발생합니다.차이점은 equipe namespace안의 int nmsp_a변수를 그냥 int에서 const int로 바꾼 것 뿐인데 충돌이 일어나는 것처럼 보입니다.const와의 어떠한 문제 때문인 것으로 추측되는데 vars.cpp의 namespace안의 nmsp_a변수에는 extern을 붙이지 않아왔고 nmsp_a를 가져다끌어 쓰는 header.h에서만 extern을 붙여줬는데 아래 사진과 같이vars.cpp의 nmsp_a 변수에 오류를 발생시키던 const를 붙이되 extern또한 추가로 붙여주면 정상출력을 합니다. const를 안 붙이는 상황에선,변수를 정의해두는 vars.cpp에서는 extern를 쓰지않고이를 가져오는 주체인 header.h에만 extern를 붙여도 정상작동했지만 const를 붙이는 상황에선,vars.cpp, header.h 두 곳 모두 각각 변수에 extern을 붙여줘야한다는 결론을 얻었습니다. 말이 좀 복잡한데 정리하자면왜 변수에 const가 없으면vars.cpp에는 extern을 안 붙여도 되고왜 변수에 const가 있으면vars.cpp에도 extern을 꼭 달아줘야하는지그런 차이가 왜 생기는지 궁금합니다. 감사합니다.
-
미해결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개를 택할 때는 따로 구해주었는데 어떤 걸 놓친 걸까요?테스트케이스는 모두 통과하였는데 오답입니다
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
매크로 함수를 쓴 이유
안녕하세요!좋은 강의 잘 듣고 있습니다.common.cpp 코드 중에서 ELAPSED_TIME_BEGIN(N)과 ELAPSED_TIME_BEGIN(N)을 매크로 함수로 정의한 이유가 무었인지요?CUDA_CHECK_ERROR() 함수는 __FILE__과 __LINE__ 때문에 매크로 함수로 정의하신 걸로 이해합니다만, 시간 측정 함수들을 매크로함수로 정의하신 이유는 잘 이해되지 않습니다.답변 부탁드립니다.감사합니다.
-
미해결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; }