묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 문제 질문입니다.
안녕하세요 1-G 문제를 풀었는데일단 게시판에 있는 반례를 다 적용하여도 틀렸다고 하는데 알고리즘 부분에서 복잡해서 그런거 같은데 어떤 문제점이 있는가요?http://boj.kr/7c33677aa106459385854be91d02ac26아.... 제가 다시 보니 asterisk가 한 개이군요,,,, 저는 asterisk 갯수도 제한 없는 줄 알았네요.. ㅎㅎㅎ;
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
StrCmp 질문 있습니다
char a[BUF_SIZE] = "Hello";char b[BUF_SIZE] = "Helloa";일 때StrCmp를 실행 하고 난 후 이 부분에서 i 가 5일 때 a[i] 의 값이 '\0' 인데 왜 while 문을 한번 더 도는지 잘 모르겠습니다
-
미해결홍정모의 따라하며 배우는 C++
개념이 헷갈려서 질문드립니다 (6.7a 널포인터)
포인터 자체가 가지고 있는 주소와포인터가 가리키는 변수의 주소랑 다른 개념이지 않나요? 예를 들어double d=123.4;double *ptr=&d;이면&ptr은 포인터 자체가 가지는 주소이고&(*ptr)은 포인터가 가리키는 변수의 주소인데이 값이 다르지 않나요? 이 말이 맞다면포인터 변수는 포인터 자체의 주소와 포인터가 가리키는 변수의 주소 둘 다 가지고 있는 건가요?너무 헷갈려서 질문드립니다 ..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
구간합 질문 있습니다.
구간합 풀이에서 강사님께서 항상 typedef long long ll;로 설정을 하시는데 풀이에서는 long long을 사용하지 않는데 타입 정의를 해주는 이유가 따로 있으신지 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-B 동전뒤집기
안녕하세요 먼저 제가 처음 작성한 코드입니다.http://boj.kr/fa4a2cffd39f4e388d7b79b7d140679강사님의 코드와 99% 유사한데, 17코드, FOR문에서 i<=(1<<n)로 작성하였을 때, 틀렸다고 나왔습니다. 여기서, i<=(1<<n) --> i<(1<<n)로 변경하였을 때는 맞다고 나왔습니다. 그런데, 저는 (1<<n)열까지 포합시켰을 때 틀린 이유를 모르겠습니다.(1<<n) 열은 아무 값도 없어서 굳이 탐색할 필요 없지만, 전역변수로 선언하면 어차피 0으로 초기화 되므로, cnt는 항상 0이 되야 된다고 생각했는데1<<n열의 값을 출력해보니까 -5,-6 같은 값이 들어가 있는 이유를 모르겠습니다.
-
해결됨[게임 프로그래머 도약반] DirectX11 입문
모든 GameObject가 하나의 TransformBuffer를 쓰는 건에 대하여
MeshRenderer에 구현되어서 각 GameObject마다 한개씩 가지고 있던 TransformBuffer를 RenderManager로 옮기면서 모든 GameObject에 한개의 TransformBuffer를 사용한다고 하셨습니다.질문은 "모든 GameObject에 TransformBuffer를 하나만 사용하면 TransformData가 중간에 곂쳐서 지워지거나 하진 않는가?" 입니다.제가 생각해봤을때 모든 Renderable GameObject 하나하나마다 for문을 통해 지금 GameObject가 이미 렌더링 되고 다음 GameObject로 넘어가므로 이전 GameObject를 그리기 위해 사용한 ConstantBuffer의 내용을 갱신해도 괜찮다고 생각되는데 제 생각이 맞나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 시간초과 질문
https://www.acmicpc.net/source/66823795안녕하세요 선생님 항상 좋은 강의 감사드립니다.해당 코드를 보면 선생님의 코드와 사실상 동일한 것 같은데,왜 시간초과가 발생하는지 모르겠습니다. ㅠㅠ제가 어떤 부분을 놓치고 있는 걸까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-B 메모리초과
안녕하세요 선생님문제를 풀던 중 궁금한 내용이 생겨서 질문 드립니다.#include<bits/stdc++.h> using namespace std; string str; string bstr; stack<char> st; int flag; int main() { cin >> str >> bstr; for (int i = 0; i < str.length(); i++) { st.push(str[i]); if (st.size() >= bstr.size() && st.top() == bstr[bstr.length() - 1]) { // 마지막이랑 똑같으면 string istr = ""; for (int a = 0; a < bstr.length(); a++) { istr += st.top(); st.pop(); } reverse(istr.begin(), istr.end()); if (istr != bstr) { for (int b = 0; b < istr.length(); i++) { st.push(istr[b]); } } } } str = ""; if (st.size() == 0) { cout << "FRULA" << "\n"; } else { while (st.size()) { str += st.top(); st.pop(); } reverse(str.begin(), str.end()); cout << str << "\n"; } return 0; } 제가 처음으로 작성한 코드입니다.for(char a : str) st.push(a) 같이 범위 기반 for문 대신for (int i = 0; i < str.length(); i++) st.push(str[i]) 같이 원래의 for문 방식을 사용했다가메모리 초과 오류를 겪었습니다.두 방법이 어째서 메모리 차이가 많이 나는지 궁금합니다!항상 감사합니다 좋은 하루 되세요 :)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
mod11 개념문제 백트래킹 질문드립니다.
큰돌님 안녕하세요.3주차 문제들을 풀던 중 의문점이 생겨서 질문드립니다.3주차 개념강의 때 합을 mod 11한 숫자 중 가장 큰 수를 구하는 예시문제가 있었습니다.이 문제를 아래와 같은 방법으로 재귀를 통해 각 숫자별로 더할지 말지로 나눠서 숫자가 {1,2,3}인 경우는 총 경우의 수가 8이 된다고말씀하셨습니다.go(idx + 1, sum + v[idx]); go(idx + 1, sum); 그런데 3주차 문제들을 풀던 도중 백트래킹을 쓰는 경우와 이렇게 재귀로 현재 위치를 하나씩 증가시켜가며 포함하는지 안하는지를 체크해가며 완전탐색을 돌리는 경우가 같은 경우가 아닌가 하는 의문점이 들었습니다(둘 다 모든 경우를 따지는 것이기 때문입니다).그래서 개념강의 예시문제를 다시 백트래킹으로 풀어보았는데 {1,2,3}인 경우에서 8번의 경우를 따져야 하는데 경우의 수를 4번만 도출해는 것을 확인하였습니다. 아래는 백트래킹으로 구현한 mod 11 문제입니다.#include<bits/stdc++.h> using namespace std; const int mod = 11; int n, temp, cnt, ret; vector<int> v; void go(int idx, int sum){ if(idx == n){ ret = max(ret, sum % mod); cnt++; return; } for(int i = idx; i < n; i++){ sum += v[i]; go(i + 1, sum); sum -= v[i]; } // 설명해주신 방식 // go(idx + 1, sum + v[idx]); // go(idx + 1, sum); } int main(){ cin >> n; for(int i = 0; i < n; i++){ cin >> temp; v.push_back(temp); } go(0, 0); cout << ret << '\n'; cout << cnt << '\n'; }코드를 하나하나 디버깅해가며 체크해보면서 왜 4번만 경우를 구하게 되는지는 알게 되었는데,개념적으로 백트래킹이라는 개념이 모든 경우의 수를 구하는 것이고, 기존에 풀었던 방법인 idx를 증가시키면서 해당 위치의 숫자를 더할지 말지를 구하는 것도 모든 경우의 수를 구하는 것이라서 두 경우의 문제 접근할 때의 사고방식이 같다고 생각하는데 왜 백트래킹은 안되는 것인가요? 두 경우의 차이점이 너무 헷갈립니다 ㅠㅠ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-F void go(int here)코드 질문드립니다
void go(int here){ if(here == 0) return; printf("%d ", here); if(here % 3 == 0 && dp[here] == (dp[here / 3] + 1)) go(here / 3); if(here % 2 == 0 && dp[here] == (dp[here / 2] + 1))go(here / 2); if((here - 1 >= 0) && (dp[here] == (dp[here - 1] + 1))) go(here - 1); return;}왜 이렇게 하면 안되나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
x64로 MultiplyBy(b,a)를 보고 있습니다
4.2 스택프레임 강의 수강중입니다 x32와 x64는 다르다고 하셨는데주소가 4byte, 8byte 차이인거 말고도 push 가 없고 mov만 쓰고 있는거 같기도 했는데 제꺼는 선생님꺼랑 다르게 RDX 레지스터로 mov하는것 같았습니다 mov 해서 b를 넣기 전에는 RDX 값이RDX = 0000014CC24ABD40 였다가 b를 넣고 난 이후에는RDX = 0000000000000005 로 바뀌었는데 주소가 들어가있다가 값으로 바뀌는게 너무 어색합니다기존에 RDX에 들어 있었던 0000014CC24ABD40 는 쓰레기 값인가요??? x64에서 원리가 궁금합니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 목차관련 궁금한점이있어서 문의합니다.
혹시 union - find, disjoint set은 어디에 나와있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-L 시간초과 질문
http://boj.kr/5633bd87bd1d49e28ec713fc1ed3da93재귀함수를 이용하여 풀었더니 시간초과가 납니다. nCr 에서 r이 작다면(r <= 3) 중첩 for문을 이용하는 게 더 빠른 건가요?
-
해결됨삼각형의 실전! CMake 초급
CMakeCache.txt에서 ON과 1은 같은건가요?
1이 true이듯 캐시파일에서 1이 ON과 같은건가요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
Transform #2 강의 질문있습니다.
2분쯤에 SRT를 통해서 나온 행렬이 왜 월드 변환행렬이 되고 이것의 ux, uy, uz 성분이 왜 right 벡터가 되는 것인지 잘 모르겠습니다.
-
미해결[게임 프로그래머 도약반] DirectX11 입문
좌표계 변환 행렬 강의 질문있습니다.
처음에 해당강의가 이해가 안가서 한 두세번 보다가 넘어가고 Transform#2 강의 듣고 이해가 안가는 부분이 있어서 해당강의를 다시 보는데도 아직 이해가 안 가는 부분이 있어서 질문드립니다. 해당강의 8분쯤에 벡터 BM을 풀어서 쓰면 '만능공식'이 어떻게 나오는지 까지는 이해를 했습니다.그런데 SRT 행렬 연산을 하여 나온 행렬의 ux, uy, uz의 성분이 right벡터가 된다는 말이 이해가 안가는데이해가 안 간다고 스스로 생각한 부분이SRT연산을 해서 나온 결과는 말 그대로 현재 object의 좌표를 기준으로 Scale이 변화하고 Rotation이 변화하고 Transform이 변화한 좌표값을 말하는거라고 이해를 했습니다.그런데 어떻게 SRT를 통해 나온 행렬의 1행성분 (ux, uy, uz)가 right벡터가 된다는건지 이해가 안갑니다.. SRT 스자이공부가 무엇을 말하는지 까지는 이해를하고좌표계 변환행렬강의에서 좌표는 부모를 기준으로 상대적이다 라는 개념까지는 이해가 가는데SRT행렬을 구하면 월드 변환행렬이 되고 이 SRT를 통해 나온 월드 변환행렬에서의 ux, uy, uz가 right성분이 된다는 흐름?이 이해가 가지않습니다..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
map 자료구조의 시간복잡도
블로그에서 map 자료구조의 시간복잡도가 전부 nlogn이라고 써있던데, 이게 맞나요?찾아보니 해쉬맵 종류는 전부 O(1)을 갖고 트리 맵은 logn을 갖던데, nlogn이 어떻게 나오는건지 궁금합니다.
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
20번 가위바위보 질문있습니다
처음에 아래와 같은 식으로 하드코딩 했는데, out으로 나오는 답이 메모장에 있는 답과 같은데 정답이 아니라고 떠서 질문 남깁니다.왜 틀린 건지 알 수 있을까요? #define CRTSECURE_NO_WARNINGS#include <stdio.h>int main(){ int n, input; int a[101], b[101]; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", &input); a[i] = input; } for (int i = 0; i < n; ++i) { scanf("%d", &input); b[i] = input; } for (int i = 0; i < n; ++i) { // a가 가위를 낸 경우 if (a[i] == 1) { if (b[i] == 1) { printf("D\n"); } else if (b[i] == 2) { printf("B\n"); } else { printf("A\n"); } } // a가 바위를 낸 경우 else if (a[i] == 2) { if (b[i] == 1) { printf("A\n"); } else if (b[i] == 2) { printf("D\n"); } else { printf("B\n"); } } // a가 보를 낸 경우 else if (a[i] == 3) { if (b[i] == 1) { printf("B\n"); } else if (b[i] == 2) { printf("A\n"); } else { printf("D\n"); } } } return 0;}
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요! 큰돌님 질문있습니다!
2-O문제에서 공백이 포함된 문자열들을 여러개 입력받을때 풀이에서는 bufferflush를 안했는데 안해도 되는 이유가 있을까요?? 궁금해서 질문드립니다!2-O 해설코드입니다!#include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); while(true){ string s; getline(cin, s); if(s == ".") break; stack<int> stk; bool check = true; for(int i = 0; i < s.length(); i++){ if(s[i] == ')'){ if(stk.size() == 0 || stk.top() == '['){ check = false; break; }else{ stk.pop(); } } if(s[i] == ']'){ if(stk.size() == 0 || stk.top() == '('){ check = false; break; }else{ stk.pop(); } } if(s[i] == '(') stk.push(s[i]); if(s[i] == '[') stk.push(s[i]); } if(check && stk.size() == 0) cout << "yes\n"; else cout << "no\n"; } return 0;}
-
미해결홍정모의 따라하며 배우는 C++
transform_reduced 의 결과값이 틀립니다.
아무리 봐도 코드 오류가 잘 안보이네요,어느부분이 잘못되었는지 짚어주실수 있을까요?#include <iostream> #include <thread> #include <mutex> #include <utility> #include <vector> #include <atomic> #include <chrono> #include <numeric> #include <random> #include <execution> #include <future> using namespace std; auto dotProductNaive(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, unsigned long long & sum) { for(unsigned i = i_start; i < i_end; ++i) sum += v0[i] * v1[i]; return sum; } mutex mtx; auto dotProductLock(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, unsigned long long & sum) { for(unsigned i = i_start; i < i_end;++i) { std::scoped_lock lock(mtx); //c++17 sum += v0[i] * v1[i]; } return sum; } auto dotProductAtomic(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, atomic<unsigned long long>& sum) { for(unsigned i = i_start; i < i_end;++i) { sum += v0[i] * v1[i]; } } auto dotProductFuture(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end) { int sum = 0; for(unsigned i=i_start; i<i_end; ++i) { sum += v0[i] * v1[i]; } return sum; } int main() { const long long n_data = 100'000'000; const unsigned n_threads = 4; //init vectors std::vector<int> v0, v1; v0.reserve(n_data); v1.reserve(n_data); random_device seed; mt19937 engine(seed()); uniform_int_distribution<> uniformDist(1, 10); for(long long i = 0; i < n_data; ++i) { v0.push_back(uniformDist(engine)); v1.push_back(uniformDist(engine)); } cout << "std::inner_product" << endl; { const auto sta = chrono::steady_clock::now(); const auto sum = std::inner_product(v0.begin(), v0.end(), v1.begin(), 0ull);//unsigned long long const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } // cout << "Naive" << endl; // { // const auto sta = std::chrono::steady_clock::now(); // std::vector<thread> threads; // threads.resize(n_threads); // const unsigned n_per_thread = n_data / n_threads; // unsigned long long sum = 0; // for(unsigned t = 0; t < n_threads; ++t) // { // threads[t] = std::thread(dotProductNaive, std::ref(v0), // std::ref(v1), t*n_per_thread, (t+1)*n_per_thread, std::ref(sum)); // } // for(unsigned t = 0; t < n_threads; ++t) // threads[t].join(); // const auto dur = std::chrono::steady_clock::now() - sta; // cout << dur.count() << endl; // cout << sum << endl; // cout << endl; // } // cout << "Lock Guard" << endl; // { // const auto sta = std::chrono::steady_clock::now(); // unsigned long long sum = 0; // std::vector<thread> threads; // threads.resize(n_threads); // const unsigned n_per_thread = n_data / n_threads; // for(unsigned t = 0; t < n_threads; ++t) // { // threads[t] = std::thread(dotProductLock, std::ref(v0), // std::ref(v1), t*n_per_thread, (t+1)*n_per_thread, std::ref(sum)); // } // for(unsigned t = 0; t < n_threads; ++t) // threads[t].join(); // const chrono::duration<double> dur = std::chrono::steady_clock::now() - sta; // cout << dur.count() << endl; // cout << sum << endl; // cout << endl; // } // cout << "Atomic" << endl; // { // const auto sta = std::chrono::steady_clock::now(); // atomic<unsigned long long> sum = 0; // std::vector<thread> threads; // threads.resize(n_threads); // const unsigned n_per_thread = n_data / n_threads; // for(unsigned t = 0; t < n_threads; ++t) // { // threads[t] = std::thread(dotProductAtomic, std::ref(v0), // std::ref(v1), t*n_per_thread, (t+1)*n_per_thread, std::ref(sum)); // } // for(unsigned t = 0; t < n_threads; ++t) // threads[t].join(); // const chrono::duration<double> dur = chrono::steady_clock::now() - sta; // cout << dur.count() << endl; // cout << sum << endl; // cout << endl; // } // cout << "Future" << endl; // { // const auto sta = chrono::steady_clock::now(); // unsigned long long sum = 0; // vector<std::future<int>> futures; // futures.resize(n_threads); // const unsigned n_per_threads = n_data / n_threads; // for(unsigned t=0; t<n_threads; ++t) // { // futures[t] = std::async(dotProductFuture, std::ref(v0), std::ref(v1), // t*n_per_threads, (t+1)*n_per_threads); // } // for(unsigned t=0; t<n_threads; ++t) // sum += futures[t].get(); // const chrono::duration<double> dur = chrono::steady_clock::now() - sta; // cout << dur.count() << endl; // cout << sum << endl; // cout << endl; // } cout << "std::transform_reduce" << endl; { const auto sta = chrono::steady_clock::now(); const auto sum = std::transform_reduce(std::execution::par, v0.begin(), v0.end(), v1.begin(), 0ull); const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } return 0; }