inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

Transform #2 강의 질문있습니다.

미해결

[게임 프로그래머 도약반] DirectX11 입문

2분쯤에 SRT를 통해서 나온 행렬이 왜 월드 변환행렬이 되고 이것의 ux, uy, uz 성분이 왜 right 벡터가 되는 것인지 잘 모르겠습니다.

  • c++
  • directx
starkshn 댓글 1 좋아요 0 조회수 475

좌표계 변환 행렬 강의 질문있습니다.

미해결

[게임 프로그래머 도약반] 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성분이 된다는 흐름?이 이해가 가지않습니다..

  • c++
  • directx
starkshn 댓글 1 좋아요 0 조회수 661

map 자료구조의 시간복잡도

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

블로그에서 map 자료구조의 시간복잡도가 전부 nlogn이라고 써있던데, 이게 맞나요? 찾아보니 해쉬맵 종류는 전부 O(1)을 갖고 트리 맵은 logn을 갖던데, nlogn이 어떻게 나오는건지 궁금합니다.

  • c++
  • 코딩-테스트
Maruche 댓글 1 좋아요 0 조회수 2077

20번 가위바위보 질문있습니다

미해결

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

처음에 아래와 같은 식으로 하드코딩 했는데, out으로 나오는 답이 메모장에 있는 답과 같은데 정답이 아니라고 떠서 질문 남깁니다. 왜 틀린 건지 알 수 있을까요? #define CRT SECURE_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; }

  • c++
  • 코딩-테스트
댓글 1 좋아요 0 조회수 492

안녕하세요! 큰돌님 질문있습니다!

미해결

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++
  • 코딩-테스트
나물사랑 댓글 1 좋아요 0 조회수 293

transform_reduced 의 결과값이 틀립니다.

미해결

홍정모의 따라하며 배우는 C++

아무리 봐도 코드 오류가 잘 안보이네요, 어느부분이 잘못되었는지 짚어주실수 있을까요? #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; }

  • c++
pcm1024zx 댓글 1 좋아요 1 조회수 286

그리디에 대해서 질문있습니다

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

강의를 보는데 이해가 안되는부분이 있어 질문드립니다 그리디 문제의 경우는 실제로 해당경우에 대한 모든 경우의수가 대입된다면 임의의 해답논리를 이용해서 푼 경우가 진짜 정답은 아닐 수 있으나 문제에서 제시되는 테스트케이스는 해당 논리에대해서는 참 이라는 조건이 제시되는 문제로만 구성되있다고 생각하면 되는걸까요?

  • c++
  • 코딩-테스트
이선용 댓글 1 좋아요 0 조회수 289

코드중 이해안가는부분이있습니다

미해결

[게임 프로그래머 도약반] DirectX11 입문

Awake() : 모든 오브젝트가 초기화되고 호출 Start() : 스크립트 인스턴스가 활성화된 경우에만 호출 유니티 랑 비슷하게 하시려고 만드신 건 이해했습니다 근데 생성자가 있는대 필요한 이유가 있을까요? 생성 순서 문제 때문이라도 Awake나 Start 하나만 써도 될 것 같아서요

  • c++
  • directx
슝슝이 댓글 1 좋아요 0 조회수 331

Iterator를 사용하는 이유가 무엇인가요?

미해결

홍정모의 따라하며 배우는 C++

제가 생각해본 바로는, 추후 코드의 리팩토링 과정을 더 편하게 만들기 위해(?)같습니다. 많은 STL 의 컨테이너가 동일한 용법을 갖고 있으면 편할테니까요. 혹시 다른 이유가 더 있을까요?

  • c++
seoinseoulcity 댓글 1 좋아요 1 조회수 492

lock guard를 사용한 쓰레드 연산결과가 inner_product 함수를 사용한 결과와 다릅니다.

해결됨

홍정모의 따라하며 배우는 C++

오타가 없는 것 같은데 무슨 이유로 다른 값이 나오는지 알수가 없네요. 도움부탁드립니다. 아래는 코드 전문입니다. #include <iostream> #include <thread> #include <mutex> #include <utility> #include <future> #include <vector> #include <atomic> #include <chrono> #include <numeric> #include <random> #include <execution> using namespace std; 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; } 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]; } } 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; } return 0; }

  • c++
pcm1024zx 댓글 2 좋아요 1 조회수 355

반례 찾아주세요ㅜㅜ

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요 강사님 강의 잘 듣고 있습니다. 강사님 강의를 보기 전에 제가 스스로 풀었던 내용입니다. https://www.acmicpc.net/source/66606871 문제의 예시와 첫 글자 z도 다 잘 출력 되었는데 어디서 실패하는건지 모르겠어서 여쭤봅니다...!

  • c++
  • 코딩-테스트
최성관 댓글 1 좋아요 0 조회수 264

lower_bound 에 교안과 다른 숫자로 변경하면

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

처음에는 교안과 동일한 숫자를 넣어봤다가 다르게 숫자를 넣어봤는데.. lower_bound는 그대로 2고 upper_bound는 2로 변해버립니다.. 왜그런걸까요? 그리고 주소값도 변하지가 않습니다.. 실행환경때문에 그런걸까요? 그리고 typedef long long 11을 적으면 error: expected unqualified-id before numeric constant 라는 에러가 발생합니다..(그래서 아래 코드보면 안적혀있어요) 그리고 제가 이해한것이 맞는지 알려주시면 감사하겠습니다. 교안기준 주소값을 기반으로 몇번째 요소인지를 뽑아낼 수 있다고 적혀있는데 그말은 곧 "0xd21518 - 0xd21510 = 8 이 나오는데, int형이니까 4바이트가 두개와 같으니 2번째 인덱스를 의미한다 " 라고 이해했습니다.. #include <bits/stdc++.h> using namespace std; int main(){ vector<int> a {1,2,5,6,7,3,3,3,4}; cout << lower_bound(a.begin(), a.end(), 3) - a.begin() << "\n"; cout << upper_bound(a.begin(), a.end(), 3) - a.begin() << "\n"; cout << &*lower_bound(a.begin(), a.end(), 3) << "\n"; cout << &*a.begin() << "\n"; cout << &*(a.begin() + 1) << "\n"; return 0; } /* 실행결과 2 2 0xe71d68 0xe71d60 0xe71d64 */

  • c++
  • 코딩-테스트
ymh_0825 댓글 1 좋아요 0 조회수 260

인벤토리 강의 예제 코드가 작동되지 않습니다.

해결됨

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

이 상황과 관련해서 몇 가지 같이 질문드려봅니다... 두 번째 for문(-> 주석 '//PK당해서 랜덤으로 일부 아이템 드랍' 부분)에서 스코프 내 지역변수가 최적화되어 사용할 수 없다는 메시지와 함께 내용을 알 수 없다고 나옵니다. 비슷한 경우를 포폴 작업하면서 몇 번 마주한 적이 있었는데요, 혹시 왜 이런 걸까요?_? (참고 사진) 이 질문이 본론이기는 한데, if문으로 RemoveItem 호출 후 반환되는 bool값에서 계속 false가 반환되는 듯 합니다. 1번 질문에 남긴 이유 때문에 디버깅으로 정확한 원인을 파악하지 못했습니다(ㅠㅠ) 그리고 같은 부분을 강의에서 코드가 정상 작동 되는지 확인해주셨었는데요(50:33), 이 때 if문 끝에 세미콜론이 붙어 조건문의 내용으로 적었던 출력 부분이 반드시 작동되도록 처리 되었더라구요. 강의를 여러 번 반복해서 보며 제가 잘못 작성한 부분이 있는지 확인해보았으나 발견하지는 못했습니다.. 혹시 정상 작동 시키려면 어떻게 수정해야 하는 걸까요?

  • c++
  • 네트워크
  • ue-blueprint
  • 게임수학
  • windows-api
박창현 댓글 1 좋아요 0 조회수 341

3-C 인구이동 코드 질문

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

코드에 대한 질문이 있습니다. 아래는 제가 짠 코드입니다. 다른 부분은 볼 필요 없이 dfs(i, j) 이 부분에 대한 궁금증이 있습니다. 저는 dfs(i, j) ... void dfs(int y, int x)이런식으로 짰는데 강사님 코드를 보면 dfs(i, j, v) ... void dfs(int y, int x, vector<pair<int,int>> &v) 이런식으로 줬습니다. 이렇게 짜야하는 이유가 궁금합니다. 이에 대한 제 예상 해답은 벡터에 call by reference를 적용했기 때문인데 왜 call by reference를 적용해야하는지를 모르겠습니다. 벡터에 call by reference를 적용한다고 치면 void dfs 안에 있는 다른 변수들(sum, cnt) 같은 변수들도 dfs(i, j, sum, cnt) 이런식으로 줘야하는것이 아닌가요? call by value, call by reference 부분 교안을 봐도 이해가 되지 않아서 질문드립니다. 자세한 답변 부탁드립니다 #include <bits/stdc++.h> using namespace std; const int dy[4] = { -1 ,0, 1, 0 }; const int dx[4] = { 0, 1, 0, -1 }; int n, l, r, a[55][55], visited[55][55], sum, cnt; vector<pair<int, int>> v; void dfs(int y, int x) { visited[y][x] = 1; 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 >= n) continue; if (visited[ny][nx]) continue; if (abs(a[y][x] - a[ny][nx]) >= l && abs(a[y][x] - a[ny][nx]) <= r) { v.push_back({ ny, nx }); sum += a[ny][nx]; cnt++; dfs(ny, nx); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> l >> r; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } } int ret = 0; while (true) { int flag = 0; fill(&visited[0][0], &visited[0][0] + 55 * 55, 0); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (visited[i][j]) continue; v.clear(); visited[i][j] = 1; v.push_back({ i, j }); cnt = 1; sum = a[i][j]; //1. 왜 여기 dfs에서 dfs(i, j, v)로 줘야하는지? //2. 만약 이에 대한 해답이 call by reference 이면 //위에 따로 빼놓은 dfs 함수 부분에서 //sum, cnt 이런 변수들도 똑같이 dfs(i, j, sum, cnt) 이런식으로 넣어줘야 하는 것이 아닌지? dfs(i, j); if (cnt == 1) continue; for (pair<int, int> b : v) { a[b.first][b.second] = sum / cnt; flag = 1; } } } if (!flag) break; ret++; } cout << ret << '\n'; return 0; }

  • c++
  • 코딩-테스트
firdoo 댓글 1 좋아요 0 조회수 188

회사 필기시험 질문

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요. 제가 이번에 서류에 합격해서 필기시험을 친다는데 필기시험과 코딩테스트의 차이는 무엇인가요? 시간은 1시간인데 뭐가 나올지 너무 두렵고 막막합니다

  • c++
  • 코딩-테스트
l1IlIl1 댓글 2 좋아요 1 조회수 275

3.6강의 16:49

미해결

홍정모의 따라하며 배우는 C++

if(x==1 && y++==2)에서 ++가 ==보다 우선순위가 높아 y가 3이되고 2랑 같지않게되어서 False이므로 중괄호안에 문장이 실행되지 않아야하는거아닌가요?제가 안에 문장넣엇는데 실행이되어서 헷갈리네요..

  • c++
junwoo612 댓글 1 좋아요 1 조회수 277

강의 12.9 - 8:59 - std::vector에서 reference wrapper와 pointer 의 성능적인 차이

미해결

홍정모의 따라하며 배우는 C++

vector<Base*> vec; for(auto& el : vec) el->print(); vector<reference_wrapper<Base>> vec; for(auto& el : vec) el.get().print(); 레퍼런스가 포인터보다 빠르지만 위에서는 get() 함수를 호출하니까 함수호출하면 스택프레임 전개되는데 이러면 오히려 오버헤드가 더 커지는것 아닌가요? 궁금해서 질문 올립니다.

  • c++
콩팥팥죽 댓글 1 좋아요 2 조회수 461

5-V 문제 질문

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요 큰돌선생님 매번 좋은강의 감사합니다 해당문제 풀이에서 다른부분은 모두 이해 가는데, make함수에서 if(interval == n) break; 부분이 왜 필요한지 잘 모르겠습니다. 어차피 for 루프가 끝나면 자동으로 종료되기때문에 필요없다고 생각하여 제출했는데 틀렸다고 나오네요 혹시 무엇때문에 필요한 것인가요?

  • c++
  • 코딩-테스트
이명운 댓글 1 좋아요 0 조회수 300

5 - B stack 풀이 질문

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

안녕하세요, 강사님의 강의를 수강하며 코딩테스트를 준비하고 있는 수강생입니다. 강사님의 좋은 코드 설명과 양질의 코드로 항상 감사하게 생각하고 있는데요, 다름이 아니라 제가 5 - B 문제를 풀다가 질문이 생겨서 글을 올리게 되었습니다. 저는 해당 <문자열 폭발> 문제를 읽자마자 '아 여느 괄호 연쇄 폭발 문제랑 비슷하구나' 라는 생각이 들어서 스택으로 문제 풀이 가닥을 잡게 되었는데, 그 와중에 전과는 다르게 폭발하는 string의 길이가 길어 졌으니 매번 탐색을 해주어야겠다, 시간 복잡도도 괜찮을 것 같다! 라는 생각에 코드를 작성해봤습니다. 생각보다 정답 풀이가 저의 풀이와 비슷해서 기분도 좋았는데, 왠지 모르게 시간초과가 계속 발생합니다. <질문> 어느 부분을 고치면 시간 초과를 없앨 수 있을까요? 그리고 이러한 시간 초과를 겪지 않으려면 어떤 코딩 방식을 지향해야할까요? (이건 개인적으로 지금 발생하고 있는 문제가 제 코드 작성 습관과 관련이 있디고 생각해서 적었습니다.) #include<iostream> #include<stack> #include<queue> #include<vector> #include<string> #include<climits> #include<algorithm> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); string str; cin >> str; string bomb; cin >> bomb; stack<char> s; int len = str.length(); int bomb_len = bomb.length(); for(int i = 0; i < len; i++) { char now = str[i]; // 폭탄을 확인할 만큼 stack이 큰지 확인 // 폭탄을 넣을 만큼 크지 않다면 그냥 stack에 문자 넣기 if(s.size() >= bomb_len - 1 && now == bomb[bomb_len - 1]) { // 폭탄 글자 길이 만큼 스택에서 글자 우선 뽑기 string token; token = token + now; for(int j = 1; j < bomb_len; j++) { token = token + s.top(); s.pop(); } reverse(token.begin(), token.end()); // 뽑은 문자열이 폭탄 글자인지 확인 // 폭탄이 아니라면 다시 넣어주고 폭탄이면 뺀 문자열 그냥 버림 if(token != bomb) { for(int j = 0; j < bomb_len; j++) { s.push(token[j]); } } } else { s.push(now); } } if(s.empty()) { cout << "FRULA"; } else { string answer; int ans_len = s.size(); for(int i = 0; i < ans_len; i++) { answer = answer + s.top(); s.pop(); } reverse(answer.begin(), answer.end()); cout << answer; } }

  • c++
  • 코딩-테스트
hjeongb0320 댓글 2 좋아요 0 조회수 189

file not found 에러 해결법

미해결

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

Mac 유저일 경우, 초반 컴파일러 설정에서 다음과 같이 에러가 뜰 수 있습니다. 저는 sudo 를 사용해도 에러가 뜨더군요ㅠㅠ 구글링을 좀 하다보니 다음과 같이 해결방법을 찾게 되어 공유드립니다. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 이 파일 경로에 bits 디렉토리를 생성하고 똑같이 작성하면 문제없이 잘 작동합니다!

  • c++
  • 코딩-테스트
토이 댓글 2 좋아요 1 조회수 1272

인기 태그

인프런 TOP Writers

주간 인기글