묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G (백준 9996)문제 질문 드립니다
안녕하세요 큰돌님 😀1-G 문제를 풀었는데 출력이 모두 맞게 나오는데 틀렸습니다..! 다른 비슷한 질문에서 알려주신 반례들을 넣어도 출력이 맞게 돼서 오래 생각해봤음에도 도저히 반례를 찾지 못하겠어서 질문 드립니다ㅜㅜ http://boj.kr/e658e81ea13b4cca95eea034abd180fb제가 생각한 로직은 먼저 입력받은 패턴의 '*' 위치의 index를 구하고, 그 인덱스를 기점으로 두 개의 문자열로 나누었습니다.a*b 이면, one 이라는 문자열에 a를 넣고, two 라는 문자열에 b를 넣었습니다.그리고 one 문자열은 앞에서부터 N번 입력받은 tmp의 배열과 비교하였고,two 문자열은 뒤에서부터 N번 입력받은 tmp 배열과 비교했습니다.출력은 맞게 나오는데 혹시 제가 생각한 것에 문제가 있을까요??ㅜㅜ항상 감사합니다 😀 http://boj.kr/37bf9df65f56423bac450aeb1601ca9d반례 찾고 코드 수정해서 통과했습니다 😀코드가 더럽긴 한데 해당 강의 보면서 더 연습하겠습니다ㅎㅎ!!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 107p Array vs Linked_List 시간
Linked_List가 순차접근을 하니까 원소에 접근할때 O(N)이 걸리는건 알겠는데삽입,삭제에 O(1)이 걸리는게 이해하기 힘듭니다똑같이 순차접근을 해야하니까 O(N)이 걸려야 하는거 아닌가요??? Array에서 랜덤접근이 가능하니까 접근할때는 O(1)이 걸리는거 알겠는데삽입,삭제에 O(N)이 걸리는건 이해하기힘듭니다접근할때와 마찬가지로 랜덤접근하면 O(1)이 걸려야 하는거 아닌가요???
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-S dfs 코드 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 큰돌님. 코드 자체는 정답인데 , 큰돌님 처럼 반환값이 있는 dfs 말고 전역으로 cnt 변수를 cnt++ 해서 각 노드의 방문 횟수를 확인하는 것은 비효율적인 가요?? http://boj.kr/298fbbac55e4456f974190efc75b1762
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-A (2178 - 미로찾기) 문제
https://www.acmicpc.net/board/view/138139코드가 불완전해서 채점에 아직 돌리지 않아서 백준 글쓰기 링크를 올렸습니다..!(다시 올렸습니다..!) 막 dfs,bfs를 배우기 시작했는데 최소거리를 구할땐 bfs를 써야 한다고 선생님 강의에서 배웠습니다. 호기심으로 dfs를 시도했는데 출력이 아무것도 나오지 않습니다.. 어떤 부분을 고쳐야 할까요? 하루종일 했는데 답이 나오지 않습니다 ㅠㅠ 2-A (2178 - 미로찾기) 문제입니다. 선생님의 완벽한 dfs 코드가 있으면 보여주시면 더욱 감사하겠습니다..! 보고 배우고싶습니다.
-
미해결홍정모의 따라하며 배우는 C++
short circuit evaluation
#include <iostream> using namespace std; int main() { //short circuit evaluation int x = 2; int y = 2; if (x == 1 && y++ == 2) { cout << "good" << endl; } cout << y << endl; return 0; }강의 18:05에서마지막에 y값이 2로 출력되는 이유가&&연산자는 왼쪽을 계산했을 때 false면 오른쪽을 계산하지않는다고 하셨습니다.if (x == 1 && y++ == 2)근데 이 문장에서 연산자 우선순위를생각해보면 y++ > == > &&니까 y++(후위증가연산자)먼저 되서 y는 이 문장이 끝나면 어쨌든 1이 증가되야하는것 아닌가요?그 후 그다음 연산자 우선순위인 ==, &&순으로 진행되어야 하지 않나요?제가 잘못이해한걸까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강사님 안녕하세요! 그저께 수강신청한 대학생 입니다.
제가 그저꼐 강의를 구매하게 되었는데, 주 언어인 자바로 코딩테스트를 준비하는 게 맞을 거 같아서정말 죄송하지만, 지금 자료 다운로드 버튼을 눌러버려서 환불이 안돼는 상황인데 혹시 수수료를 절반 차감하더라도 일정부분이라도 받을 수 있을까요? ㅜㅜ 깊게 생각하지 못하고 결제하게 되서 정말 죄송합니다..ㅜㅜ자료는 정말 읽어보지 않았고 바로 삭제한 상태입니다!ㅜㅜ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 2번 케이스를 해야하는 이유를 제가 잘 이해한게 맞을까요?
쌤, 강의 시간 3:36 초에서 [50만][50만] 배열을 생성하면 공간복잡도가 커서 안된다는 말씀을 듣고 그 예시를 코드로 작성해 보았습니다! (Case 2 를 해야하는 이유를 이해하기 위해서)http://boj.kr/3b3efff1b680482380e9e4a513b6ce12max 를 500으로 하면 돌긴하는데 당연히 틀리고, 50만으로 하니 컴파일 에러가 떠서 안되더라구요.. 이차원 배열 행을 "각 턴"으로 생각하였고, 열을 "위치"로 생각하여 풀었습니다.영상에서는 "수빈의 범위", "동생의 범위"라고 알려주시긴 하셨는데 같은 내용으로 이해한 것이 맞는지 궁금하였습니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-N 질문 있어요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.http://boj.kr/3a71a94e910e4a2da75f16b9b380ced6 위의 코드에서 5번째 줄 즉 int solve라고 하면 왜 틀리는지 알고 싶습니다. 제가 생각하기엔 return 시 다 c로 나눈 나머지가 전달되고 그러면 c(2,147,483,647)보다 작은 값 즉 int형으로 담아내기 충분한 값이 return 될텐데 왜 long long 일 때와 달리 틀렸다고 나오는지 알고 싶습니다. 5번째 줄 int solve를 long long slove로 바꾸면 맞았다고 나옵니다. 또한 강사님의 공유 코드에서 if(b % 2)ret = (ret * a)% c;라는 부분이 9줄에 있는데 이게 아니라 if(b % 2)ret = (ret * (a % c))% c; 가 되어야 하는 거 아닌지 알고 싶습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-N 시간 복잡도 접근 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 단순히 한 자리에서 5번 호출, 영향을 받을 수 있는 지점 99개가 있으므로 최대 약 5^99 이라고 생각했거든요.5x5의 색종이를 붙이니까 영향 받는 타일이 더 생략될 수는 있겠다 싶었지만 좀 그래도 좀 클 것이라고 생각했습니다.혹시 선생님이 이 문제 어떻게 접근하셨는지 궁금합니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-A dfs 시도
https://www.acmicpc.net/group/board/view/20223/37592 코드가 불완전해서 채점에 아직 돌리지 않아서 백준 글쓰기 링크를 올렸습니다..! 막 dfs,bfs를 배우기 시작했는데 최소거리를 구할땐 bfs를 써야 한다고 선생님 강의에서 배웠습니다. 호기심으로 dfs를 시도했는데 출력이 아무것도 나오지 않습니다.. 어떤 부분을 고쳐야 할까요? 하루종일 했는데 답이 나오지 않습니다 ㅠㅠ 2-A (2178 - 미로찾기) 문제입니다. 선생님의 완벽한 dfs 코드가 있으면 보여주시면 더욱 감사하겠습니다..! 보고 배우고싶습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-I / cin으로 숫자를 입력 받으면 일단 문자열로 받아지나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 큰돌님.cin을 사용해서 숫자를 입력받으면 우선 문자열로 처리된 후에 int로 변환이 되는건가요?왜냐하면 해당 문제의 코드에서 string형 변수인 s에다가 숫자를 받았는데 이 부분 때문에 고민을 많이했거든요. string형에다가 숫자를 못받을거라고 생각해서..또 교안에서 getline을 설명할 때도 숫자를 입력받은 후 '\n'을 없애기 위해 bufferflush를 사용했었는데 이것 또한 문자열로 인식하기 때문인가 싶어서요.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-A 질문합니다
마지막 부분에 vector로 새로 만들어서 넣지 않고 기존의 a배열을 미리 sort한 후 해당되지 않는 두 개의 인덱스 값만 빼서 출력했더니 틀렸다고 하네요. 차이가 무엇일까요?
-
해결됨홍정모의 따라하며 배우는 C++
(과제스포)제가 과제를 똑바로 이해했는지 궁금합니다.
#include<chrono> #include<iostream> #include<mutex> #include<random> #include<thread> #include<utility> #include<vector> #include<atomic> #include<future> #include<numeric> #include<execution> using namespace std; mutex mtx; void dotProductDQThread(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, unsigned long long& sum) { int sum_tmp = 0; //local sum for (unsigned i = i_start; i < i_end; ++i) { sum_tmp += v0[i] * v1[i]; } sum += sum_tmp; } void dotProductProm(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, promise<unsigned long long>&& sum) { int sum_tmp = 0; //local sum for (unsigned i = i_start; i < i_end; ++i) { sum_tmp += v0[i] * v1[i]; } sum.set_value(sum_tmp); } int main() { /*v0 = { 1,2,3 }; v1 = { 4,5,6 }; v0_dot = 1 * 4 + 2 * 5 + 3 * 6;*/ const long long n_data = 100'000'000; const unsigned n_threads = 4; //initialize 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); //v0와 v1에 값 무작위로 넣어줌 for (long long i = 0; i < n_data; ++i) { v0.push_back(uniformDist(engine)); v1.push_back(uniformDist(engine)); //cout << v0[i] << "\t" << v1[i] << endl; } 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);//0ull = unsigned longlong 0 const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } //TODO: use divde and conquer strategy for std::thread cout << "TODO: use divde and conquer strategy for std::thread" << endl; { const auto sta = chrono::steady_clock::now(); unsigned long long sum = 0; 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(dotProductDQThread, 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; } //TODO: use promise cout << "TODO: use promise" << endl; { const auto sta = chrono::steady_clock::now(); //std::promise<unsigned long long> sum; auto sum = 0ull; vector<thread> threads; vector<future<unsigned long long>> futures; vector<promise<unsigned long long>> proms; threads.resize(n_threads); futures.resize(n_threads); proms.resize(n_threads); const unsigned n_per_thread = n_data / n_threads; for (unsigned t = 0; t < n_threads; ++t) { futures[t] = proms[t].get_future(); threads[t] = std::thread(dotProductProm, std::ref(v0), std::ref(v1), t * n_per_thread, (t + 1) * n_per_thread, std::move(proms[t])); } for (unsigned t = 0; t < n_threads; ++t) { threads[t].join(); sum += futures[t].get(); } const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } }결과는 제대로 나오지만, 제가 과제를 똑바로 이해했는지 궁금해서 여쭤봅니다.과제1: use divde and conquer strategy for std::thread쓰레드에 sum에 local sum값을 넣어 race condition 해결과제2: prom 사용해보기sum 변수 선언 및 thread, promise, future 모두 쓰레드 크기 만큼의 vector로 만들어줬습니다. 병렬 처리 후 future값을 sum에 더해줬습니다.※추가 궁금증promise 과제 중, std::ref와 std::move 둘 다 해보았습니다. 두 경우 모두 정상 작동하였는데, 어떤 방법을 가장 추천하시나요?
-
미해결홍정모의 따라하며 배우는 C++
헤더파일 포함 컴파일 방법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아헤더 파일을 포함한 파일에 대해 컴파일하는 방법이 궁금합니다.다른 분 답변에서는 makefile을 사용하라고 다른 분께서 말씀하시던데 이해가 되지 않아 남겨봅니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 che 배열크기와 a배열 크기가 다른 이유가 무엇인가요?
bool che[4000001];int n, a[2000001], p, lo, hi, ret, sum; 이부분 왜 a배열 범위는 반으로 하신건지 궁금합니다!또 에라토스테네스 체에서 i*i크기 까지만 보통 크기 비교 해주는데 다르게 하신 이유도 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C++
\n과 endl의 차이
강의 19:25를 보면 '\n'은 단순 줄 바꿈이고 'endl'의 경우 줄을 바꿈과 동시에 버퍼에 있는 모든 것을 출력한다고 하셨습니다. #include <iostream> using namespace std; int main() { char c1; cin >> c1; cout << c1 << endl; return 0; }제가 간단하게 예제를 만들었습니다.실행 후에 c1에 입력을 단순히 하나의 문자가 아니라 12345처럼 문자열을 넣으면 c1에는 1이 담기고 2345는 버퍼에 저장된다고 생각했습니다.endl;이 버퍼에 있는 모든 것을 출력하니까 12345 모두 출력될 줄 알았는데 1만 출력되었습니다.제가 잘못 이해한 것일까요? 감사합니다.
-
미해결홍정모의 따라하며 배우는 C++
#pragma once vs. #ifndef
header guard로 #pragma once를 쓰는 방법과 #ifndef 쓰는 방법 두개를 설명해주셨는데, 두 개의 차이점이 있을까요?구글링해보면 #pragma once가 처리속도가 빠르지만, 지원되지 않는 compiler가 있는 것 같고 (현재는 대부분의 compiler는 지원되지만), #ifndef 는 모든 compiler에서 지원되지만 처리속도가 #pragma once에 비해서 느리다 라는 것 같은데, 맞는 내용인지 모르겠네요.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-C 틀린 부분을 모르겠습니다.
http://boj.kr/ab00c6a0aa494a37a90f5ce08cc4b854저는 좀 다르게 배열을 0으로 초기화하면 물에 잠긴 지역은 1로 표시해서 dfs로 0만 방문하도록 했습니다. 그런데 아무리 찾아봐도 틀린 부분을 모르겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 공부 방법
안녕하세요 큰돌님 이제 막 교안을 끝내고 1주차부터 풀어보기 시작하였는데요!풀리지 않는 문제를 고민하는 시간 1~4시간까지라고 설명해주신 유튜브 영상도 보았는데 그럼 먼저 고민하는 시간은 알려주신 대로 하고, 그럼에도 못 푼 문제는 강의를 보면 되나요??그리고 또 스스로 푼 문제는 바로 해설강의로 들어가면 될까요?? 그리고 나서 해설 강의에서 보여주신 여러 방법들을 직접 타이핑 하면서 학습하면 되는 건지 궁금합니다! 🙂 그리고 이미 풀었던 문제에 대한 복습은 어떻게, 어떤 주기로 진행하면 되는지 역시도 궁금합니다!감사합니다.
-
미해결홍정모의 따라하며 배우는 C++
쓰레드 이동 생성자 질문
#include<iostream> #include<future> #include<thread> using namespace std; int main() { { std::promise<int> prom;//future를 받아주는 존재가 필요해서 promise 거침 auto fut = prom.get_future(); auto t = std::thread([](std::promise<int>&& prom) { this_thread::sleep_for(chrono::milliseconds(1000)); prom.set_value(1 + 2); }, std::move(prom));//prom소유권을 넘겨받음 cout << "before get" << endl; cout << fut.get() << endl;//prom이 setvalue되어 값을 받아오도록 fut은 계속 기다림 cout << "after get" << endl; t.join();//thread끝나는 걸 기다려줌 } }위 코드를 전 아래처럼 이해했습니다futre가 promise의 future를 공유 받음 쓰레드 생성되며 promise의 소유권을 받음(여전히 future와 공유 관계)fut가 prom의 setvalue까지 기다림prom의 setvalue후 fut 출력됨쓰레드 join쓰레드에 std::move의 존재 이유가 궁금해서 알아보니, 쓰레드의 이동생성자였습니다. 그래서 prom의 소유권이 쓰레드로 가는건가 궁금합니다. 쓰레드 생성 후 prom.set_value(1)을 해보니 에러가 뜨기도 했습니다.