묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨홍정모의 따라하며 배우는 C++
선택정렬
void printArray(int array[], int length){for (int index = 0; index < length; ++index){cout << array[index];}cout<<endl;}int main(){int arr[] = { 3,5,2,1,4 };printArray(arr, 5); for (int i = 0; i < 4; i++){int smallest_index = i;for (int current_index = i + 1; current_index <5; current_index++){arr[smallest_index] = (arr[smallest_index]>arr[current_index]) ? arr[current_index] : arr[smallest_index]; }int temp = arr[smallest_index];arr[smallest_index] = arr[i];arr[i] = temp; printArray(arr, 5);}} 다음 코드를 실행하면 제대로 된 오름차순 형태의 선택 정렬이 나타나지 않고3521415214112141111411114이렇게 나옵니다. 숫자가 swap되는 부분이 잘못된 것 같은데 어느 부분을 고쳐야 할까요?
-
미해결홍정모의 따라하며 배우는 C++
선언, 정의 부분 파일을 분리할 때 (1.11강)
안녕하세요.강의 영상 1.11에서 3분 15초 부분의 내용과 관련하여 궁금한 점이 있습니다. // main.cpp #include <iostream> #include <cstdio> using namespace std; int add(int a, int b); int main() { cout << add(1, 2) << endl; return 0; }// add.cpp int add(int a, int b) { return a + b; } 저는 맥 vscode에서 실행하고 있고,강의 영상과 같이 add 함수의 정의와 선언 부분을 분리한 후, main.cpp 파일을 실행하였더니 에러가 떴습니다.add.cpp 내의 add 구현 부분이 링킹이 되지 않은건가 하여 main.cpp파일에 #include "add.cpp"를 하였는데 정상적으로 실행이 되었습니다. 그런데 찾아보니 #include "add.cpp" 자체가 어색하다고 하는데,, 뭔가 다른 방법은 없는지 알고 싶습니다! 어쩔 수 없이 vscode로 따라가다보니 중간중간 어려움이 생기네요..감사합니다.
-
해결됨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; }
-
미해결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하여 병합하였는데 이부분에 예외가 있는것인지 아니면 다른 부분에서 예외가 있는것인지 감이 안 잡히는데 어디가 잘 못된것인지 한번 봐주실 수 있나요?감사합니다 :)
-
해결됨C개발자를 위한 최소한의 C++
일반 참조형과 const 참조형에 따라 컴파일 오류가 발생하거나 발생하지 않는 이유가 궁금합니다.
안녕하세요. 강의 잘 보고 있습니다.강의 내용 중 하나 이해 안되는 것이 있어 질문 남깁니다.// 위 코드 생략 TestData testFunc(TestData& rhs) { // 생략 } int main() { TestData result = testFunc( 10 ); // 생략 } testFunc의 매개변수로 10이 넘어갔기 때문에 묵시적으로 변환 생성자 TestData(int)가 호출된 것으로 보입니다.따라서 testFunc은 생성된 TestData를 참조로 받고 있는 것 같은데, 왜 위처럼 코드를 작성하면 오류가 발생하는지 이해가 되지 않습니다.// 위 코드 생략 TestData testFunc(const TestData& rhs) { // 생략 } int main() { TestData result = testFunc( 10 ); // 생략 } 위처럼 const 키워드를 붙였을 땐 오류가 안 발생하는데 이유가 무엇인가요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
엔진을 맵툴로 활용 할수있나요?
안녕하세요3D 포폴을 다렉으로한번 만들어보고싶은데 맵툴을 따로 만들지않고 언리얼이나 유니티엔진에서 모든 오브젝트를 불러와서 배치시킨다음에정보를 저장한다음 , 불러들여서 활용할수도 있나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
26분에 pet을 nullptr로 바꾸는 이유
소멸자에서if (_pet) 은pet이 nullptr이 아닐 때 참이되어 _pet을 지울건데 이동대입연산자에서 knight의 _pet을 nullptr로 바꾸면소멸자의 if문을 통과하지 못해서_pet이 삭제되지 않는거 아닌가요?? 이동대입연산으로 똑같은 pet을 만든 다음에pet을 넘겨줬으니까삭제해도 되는거 아닌가 해서 질문드립니다
-
미해결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; } }}
-
미해결[게임 프로그래머 도약반] DirectX11 입문
LosdShaderFromFile 매개변수 string
삼각형 띄우기 31분 쯤 나오는 LosdShaderFromFile함수 작성시에 저는 string 헤더 추가하라고 오류가 뜹니다. (물론 추가 하는게 문제는 아닌데,) 선생님께서 올려주신 파일을 보니 별도로 추가 되어있지 않아서요,,,, 궁금해서 올려봅니다(너무 하찮은 질문이지만...ㅜㅜ )
-
미해결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. 새해 복 많이 받으세요
-
미해결홍정모의 따라하며 배우는 C++
바보같은 질문 드립니다.
안녕하세요.3:00 영상 초반에 클래스 외부에 add함수를 작성한 예제를 보여주셨는데, 해당함수는 레퍼런스로 c1 , c2 , c_out 을 인자로 받고 있습니다.레퍼런스로 받을경우 그 인스턴스의 메모리상 주소값을 그대로 받아오기 때문에 c.m_cents 처럼 private 에 속하는 멤버변수도 직접 접근이 가능해야 되는거 아닌가요...?레퍼런스로 인자를 받았다면 객체 그 자체로 private 영역에 접근이 가능해야될것 같은데,getter , setter 함수를 사용해서 private 변수에 접근해야되는 이유를 모르겠습니다ㅠ void add(const Cents &c1 , const Cents &c2 , Cents &c_out) { c_out.getCents() = c1.getCents() + c2.getCents(); }
-
해결됨홍정모의 따라하며 배우는 C++
클래스 내에 클래스 멤버 변수 선언 시 ()와 {}의 차이
class Something { private: int some; public: Something(const int &in_some) : some(in_some) {} void print() { cout << some << endl; } }; class Fraction { private: int nom; int denom; Something frac_some{ 3 }; // uniform init public: Fraction(const int &in_nom, const int &in_denom) : nom(in_nom), denom(in_denom) {} void print() { cout << nom << " " << denom << endl; frac_some.print(); } }; int main() { // Fraction frac(1, 2); Fraction frac{ 1, 2 }; frac.print(); return 0; }위 코드처럼 Something frac_some{ 3 }; 으로 uniform init을 하면 코드가 동작합니다.그러나 아래처럼 direct init을 하면위와 같이 오류가 발생합니다.어떤 차이가 있는 것일까요? main에서 아래처럼 두 가지 방법을 다 해보았을 때는 문제가 없었습니다main에서 Fraction frac(1, 2);을 하는 것과,클래스 내에서 멤버 변수를 선언할 때,Something frac_some(3);을 하는 것이 다른 동작인가요? 항상 감사드립니다.
-
해결됨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; }
-
해결됨C개발자를 위한 최소한의 C++
dll 파일과 name mangling 관련 질문드립니다.
안녕하세요. 강의 잘 보고 있습니다.강의를 보는데 갑자기 궁금한 것이 생겨서 질문 드립니다.exe 파일에서 필요할 때마다 dll을 참조하여 호출하는 것으로 이해하고 있습니다.dll엔 이미 함수 symbol이 정의되어 있겠죠.예를 들어 add(int a, int b) 함수를 dll로 만들었다고 가정하면 일반적인 c라면 함수 심볼이 _add라고 예상되지만, C++ 이라면 _add가 아니라 다른 형태의 심볼이 만들어질거라 생각이 됩니다.그런데 exe을 만드는 개발자 입장에서 생각해보면 무엇으로 만들어질지 모르는 심볼을 예측할 수 없으니 c처럼 _add와 같이 확실한 symbol을 선호할 것 같은데, 그러면 dll 파일을 c++로 만들 때 함수 앞에 extern "C" 키워드를 사용하나요?만약 1번 답이 맞다면 추가로 궁금한 것이 있습니다. 제가 알기론 C와 C++의 차이가 name mangling 뿐만 아니라 스택에 쌓이는 매개변수도 차이가 있다고 들었습니다. 그런데 C++로 만드는 exe 파일과 extern "C"로 선언한 dll을 같이 사용하면 문제가 생기지 않나요?부족한 것이 많아 질문에 오류가 있을 수 있습니다. 제가 잘못 알고 있는 부분은 피드백 주신다면 다시 공부하겠습니다.감사합니다.
-
미해결홍정모의 따라하며 배우는 C++
friend 키워드에 대한 개념이 안잡힙니다.
안녕하세요.아래와 같은 코드가 있다고 가정했을때,첫번째 operator(friend 키워드가 없는)는 에러표시를 하고두번째 operator(friend 키워드가 있는)는 정상 컴파일이 됩니다.friend 키워드에 대한 강의도 앞에서 보았고,'private 멤버 함수에 대한 접근이 가능하도록 해준다' 는 생각과 operator 코드 작성간의 상관관계가 무엇인지 모르겠습니다 ㅠ// 아래 함수 정의에선 해당 오퍼레이터 함수에 인자값이 너무 많다고 하고, std::ostream& operator << (std::ostream &out, const Point& point) { }// friend 키워드를 붙일경우엔 정상 컴파일이 됩니다. friend std::ostream& operator << (std::ostream &out, const Point& point) { }
-
해결됨C개발자를 위한 최소한의 C++
스크립트 오류 참조형(변하지 않는 포인터)
10:00 경 "근데 지금 값이 참조자인 ref에 들어있는 값하고 요놈하고 똑같죠. 네 그래서 여기에다 대고 그래서 간접지정해서 30 이러면은 F10키 눌러 보면 여기 데이터의 값이 바뀌는 걸 보실 수가 있죠? 네 데이터 출력하면 당연히 30이 나오겠네요. 해서 여러분이 지금까지 이만큼의 내용을 보셔서 아시겠지만 참조자라고 하는 것은 개념적인 표현이고 참조자의 실체는 포인터랑 똑같이 구현이 돼요. 그래서 기계어 수준으로 내려가서 쫓아가 보면은 결과적으로는 그렇다. 그래서 참고하시기 바랍니다. 아, 참조자 이런 거구나." 인데 이게 스크립트에서 이상하게 표시가 됩니다. 처리 부탁드릴게요. 고맙습니다!
-
해결됨C개발자를 위한 최소한의 C++
스크립트 오류
7:38초 경 텍스트가 그러면 그거랑 5랑 더해서 연산의 임시결과가 떨어졌겠죠 그게 15가 저장되어 있는 integer 인스턴스일텐데, 사라져야 될 운명이었으나 거기에다 이름을 부여한거죠. 인데 수정 제안할랬더니 길어서 짤리네요. 관리자분께서 스크립트 시간 자른 후 나눠서 바꿔주셔야 할 것 같아요.지난 시간 것도 유사한 게 있었어요. 통으로 날아가 있어서... 조치 부탁드립니다! 노트 필기하는 마음으로 스크립트 수정 중입니다. ㅎㅎ
-
미해결C++20 훑어보기
StringLiteral에서 [N]은 어떻게 동작되는건가요?
안녕하세요강의를 보다가 궁금한 점이 생겨서 질문드려요 template<int N> class StringLiteral { public: constexpr StringLiteral(char const (&str)[N]) { std::copy(str, str+N, _data); } char _data[N]; }; template<StringLiteral str> class ClassTemplate { }; template<StringLiteral str> void FunctionTemplate() { cout << str._data << endl; } int main() { ClassTemplate<"Hello World"> cls1; FunctionTemplate<"Hello World">(); return 0; }위 코드에서 [N]은 자동으로 글자의 수가 채워지는건가요? 어떻게 동작되는지 좀 설명해주시면 감사하겠습니다.