묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
시간 초과가 발생하는 이유를 모르겠습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.http://boj.kr/bcf7e7b1fc404527a3b9fca4f41fd607선생님께서 가르쳐 주신 내용 그대로 했음에도 불구하고 시간 초과가 발생했습니다. 제가 어떤 부분을 놓쳐서 시간 초과가 발생한 것일까요? ㅠㅠ
-
해결됨홍정모의 따라하며 배우는 C++
배열을 함수 내부에서 선언된 경우, 초기화했을 때의 기본값
배열을 함수 내부에서 선언된 경우, 초기화했을 때의 기본값을 출력할 때 그냥 출력하면 쓰레기값이 나오는데 for문을 이용해서 출력하면 다른 값으로 출력됩니다. 왜 차이가 발생하는 지 알 수 있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-N 예외처리 추가
선생님 안녕하세요! 우선 충격적인 풀이 방법 너무 잘 들었습니다. 계속 생각하다보니 예외처리를 먼저해주면 좋을 것 같은 게 있어서 질문 남깁니다.반드시 나누어 떨어지는 경우를 생각해 보았는데, C == 1인 경우와 A%C == 0인 경우는 항상 나누어떨어질 것 같아서 선생님 풀이와 함께 미리 예외처리를 해주었습니다.코드 링크: https://www.acmicpc.net/source/57650740질문은 다음과 같습니다.해당 예외처리가 유효한 것인지1의 질문에서 만약 유효하다면, 이전 영상에서 '속도'에 관한 풀이를 하실 때, 예외처리를 먼저 해주셨는데, 이번에는 그렇지 않아서 판단의 기준은 어떻게 잡아야 하는지예외에 걸려서 main/함수를 종료할 때 exit(0)을 써야할지 return을 써야할지제 머리로는 이 문제를 처음 봤을 때 아무리 고민해도 풀 수가 없었는데 문제를 많이 풀면서 해결할 수 있는 부분인지궁금합니다.항상 좋은 강의 감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-M 순열 재귀, next_permutation
안녕하세요 큰돌님!문제를 보고 괄호추가하기와 같은 패턴으로 풀면 될것같아서 풀어보았습니다. 재귀를 사용해서 순열을 만들어 풀이한것이 통과가 되어서 next_permutation으로 만들어봤습니다. 그런데 생각대로 잘 되지가 않네요...ㅠㅜnext_permutation으로 풀려면 어떤 방식으로 접근해야할까요?? 좋은 강의 해주셔서 감사합니다:)http://boj.kr/dd36ea0097404bbf8cdb802ca843eacd
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-G 문제의 풀이방식이 궁금해서 질문 드립니다
안녕하세요! 7-G 문제 공부 후에 프로그래머스의https://school.programmers.co.kr/learn/courses/30/lessons/154538숫자 변환하기를 풀어 보았습니다!딱 문제를 보자마자, 여러번(무제한) 쓸 수 있고dp 문제라는 생각이 들어 7-G 문제 접근 방식이 생각나서 아래와 같이 처음에 접근 했었습니다!arr[x] = 0; for(int i=n; i<= y; i++) { arr[i] =min(arr[i],arr[i-n]+1) ; } for(int i = 3*x; i<= y; i++) { if(i%3 == 0) arr[i] = min(arr[i],arr[i/3] +1); } for(int i=2*x; i<=y; i++) { if(i%2 == 0) arr[i] = min(arr[i],arr[i/2]+1); } 이렇게 for문을 나누어서 왼쪽부터 오른쪽으로 더해가면서 구하게 하였습니다. 그랬는데 틀렸다는 메세지가 나와서 혹시나 싶어서 for문을 하나 사용하여 모든 조건을 동시에 검사하게 하였더니 즉arr[x] = 0; for(int i= x; i<=y; i++) { if(i%3 == 0) arr[i] = min(arr[i], arr[i/3]+1); if(i%2 == 0) arr[i] = min(arr[i],arr[i/2]+1); if(i-n >=0) arr[i] =min(arr[i],arr[i-n] +1) ; } 위와 같이 제출 하였더니 이번엔 정답 처리되었습니다!아무리 생각을 해 보아도 최솟값을 구하는 것이기 때문에, 같이 검사하나 따로따로 검사하나 문제가 없을 것이라고 생각하였는데, 곱하기나 나누기의 경우라서 다른 걸까요 아니면 비슷한 문제이지만, 접근 방식이 아예 다른 걸까요?? 위의 두가지 방식에서 달라지는 반례를 찾아보려고 계속 생각해 봤는데, 제 머리로는 잘 모르겠어서 고민 끝에 질문 드립니다!감사합니다!혹시나 몰라 아래에 정답으로 제출된 코드 전부 첨부했습니다!#include <string>#include <vector>#include <bits/stdc++.h>using namespace std;int arr[1000002] ={0};int solution(int x, int y, int n) { fill(arr,arr+1000002,987654321); arr[x] = 0; for(int i= x; i<=y; i++) { if(i%3 == 0) arr[i] = min(arr[i], arr[i/3]+1); if(i%2 == 0) arr[i] = min(arr[i],arr[i/2]+1); if(i-n >=0) arr[i] =min(arr[i],arr[i-n] +1) ; } cout<< arr[y]<<endl; if(arr[y]== 987654321) return -1; else return arr[y];}
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K팰린드롬 문제. 맞는 것 같은데 틀렸어요
안녕하세요 1-k 1213 팰린드롬 문제를 풀었는데요, devc++로 코드 작성해서 테스트 해봤을 때 맞는 것 같아요. 그런데 백준에 제출하면 틀렸다고 뜨는데 어디가 틀린건지 모르겠어요. 도와주세요ㅠㅠ#include<bits/stdc++.h> using namespace std; string name, ret; int alpha[27]; int odd, oddnum; int main() { cin>>name; for(int i=0; i<name.size(); i++) { alpha[name[i]-'A'+1]++; } for(int i=1; i<=26; i++) { if(alpha[i]) { if(alpha[i]%2 ==1) { odd++; oddnum = i; if(odd>=2) { cout<<"I'm Sorry Hansoo\n"; break; } else for(int j=0; j<alpha[i]/2; j++) ret += (char)(i+'A'-1); } else { for(int j=0; j<alpha[i]/2; j++) ret += (char)(i+'A'-1); } } } for(int i=0; i<ret.size(); i++) cout<<ret[i]; if(oddnum && odd<2) cout<<(char)(oddnum+'A'-1); for(int i=ret.size()-1; i>=0; i--) cout<<ret[i]; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-G 최단거리 개수
안녕하세요 큰돌님, 저는 선 위에서 bfs를 돌린다 생각하고,아래와 같이 코드를 썻습니다.최단 거리는 올바르게 나오는 것 같은데,개수가 항상 틀리게 나오네요 ㅠㅠ 어디부분에 문제가 생긴지 모르겠습니다,,, http://boj.kr/a7027def8ceb49f88acccd4d15373a37
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요. 3 - I 질문 있습니다.
안녕하세요 큰돌 선생님.늘 양질의 강의 감사드리며, 제 코드에 어느 부분이 도대체 문제가 되어 틀렸다고 하는지 찾아낼 수 없어다시 한번 질문 올리게 되었습니다. 저는 동생의 위치를 1부터 n까지의 합 공식을 이용하여 별도의 queue에 저장했고,수빈이가 움직일 수 있는 3가지 경우마다 push, pop을 이용해수빈이의 위치와 동생의 위치가 같은지 체크했습니다. 그리고 다음 숫자(next)가 이미 방문했던 숫자여도 현재 동생의 위치와 같다면 바로 그 당시의 위치를 출력하도록 처리했습니다. 나름 예외처리를 위해 신경썼는데, 고민하다가 결국 갈피를 못 잡았습니다.답변 기다리고 있겠습니다. 항상 감사합니다. http://boj.kr/76e171772b6743b7a0cd05913ce5a894
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 플러드필 사용 안할경우 시간초과
안녕하세요 큰돌님3-K를 강의듣기전에 풀어봤습니다.플러드필을 사용하지 않고 풀어봤는데요예제는 잘 통과하지만 시간초과가 났습니다. 그 이유를 생각해봤을때 얼음을 녹이고 다시 얼음을 녹이러 갈때 녹인 위치부터 탐색을 시작하는게 아니라 처음부터 탐색을 시작하기 때문인거같은데제가 생각한게 맞을까요?? http://boj.kr/429e585816d54c2dafaa022e77f4c286
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
못풀겠는 문제는 그냥 강의 넘어가고 다시오는게 나을까요 강의 듣는게 나을까요
못 풀겠는 문제가 좀 많아서;; 강의 듣고 나중에 다시 와서 풀까요 아니면 그냥 다음 주차 강의로 가는게 나을까요? 지금은 문제 맞췄을때만 강의 보는데 문제당 고민은 30분 정도 합니다. 1.아예모르겠는경우 2.어떻게 풀지감은 잡았는데 구현을 못하겠는경우 3.맞는데 왜틀리는지 모르겠는경우 어느때 못풀었어도 강의를 듣는게 나을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-K 문제 선생님 코드에 질문이 있습니다.
go 함수에서 cnt가 한번이라도 음수가 돼서 ret이 음수 인덱스를 참조해서 에러가 날 것 같았는데아무 에러가 없이 통과되는 이유가 궁금합니다.예를 들면 i가 0일 때, 오락실을 통과하면 cnt가 -1이 되고, dp[y][x][cnt][prev]에 접근할 때 오류가 날 거라고 생각하는데, 아무 거리낌 없이 통과가 되는데..글쓰는 도중 너무 궁금해서 디버깅 해본 결과 인덱스가 음수여도 접근이 되네요 ㅇㅁㅇ.. 그래서 이 궁금증은 해결됐는데..cnt가 음수여도 정상적으로 답이 잘나오는 이유는 아직 잘모르겠습니다 ㅜㅜ
-
미해결홍정모의 따라하며 배우는 C++
이 수업 마지막에 lock() 이용해서 getname 하는 부분 질문입니다.
#include <iostream> #include <memory> #include <string> class Person { std::string m_name; //std::shared_ptr<Person> m_partner; std::weak_ptr<Person> m_partner; // ⭐⭐⭐ public: Person(const std::string& name) : m_name(name) { std::cout << m_name << " created\n"; } ~Person() { std::cout << m_name << " destroyed\n"; } friend bool partnerUp(std::shared_ptr<Person>& p1, std::shared_ptr<Person>& p2) { if (!p1 || !p2) return false; p1->m_partner = p2; p2->m_partner = p1; std::cout << p1->m_name << " is partnered with " << p2->m_name << "\n"; return true; } const std::shared_ptr<Person> getPartner() const // ⭐⭐⭐ { return m_partner.lock(); // ⭐⭐ lock 함수 실행 } const std::string& getName() const { return m_name; } }; int main() { auto lucy = std::make_shared<Person>("Lucy"); auto ricky = std::make_shared<Person>("Ricky"); partnerUp(lucy, ricky); std::cout << lucy->getPartner()->getName() << std::endl; return 0; }수업 중 마지막 코드 입니다. std::cout << lucy->getPartner()->getName() << std::endl;이 부분을 통해 Ricky를 출력하게 되는 과정을 다음과 같이 해석했는데 제가 해석한게 맞는지 확인 부탁드립니다.lucy->getPartner() 에서 lucy객체의 멤버 변수이자 weak_ptr인 m_partner의 lock()함수 호출한편 m_partner를 ricky라는 객체 역시 소유하고 있음(partnerUp함수로 인해)따라서 lock()는 ricky객체를 shared_ptr로 임시 변환해서 리턴오로지 weak_ptr로는 소유하고 있는 객체의 멤버에 접근하는 것이 불가능했지만 lucy->getPartner() 이런 방식으로 ricky라는 객체를 리턴하였고 따라서 ricky라는 객체의 맴버함수 및 맴버변수에 접근할 수 있게 되었다.1.저 코드 한줄에 대한 제 해석이 맞는지 확인 부탁드리고 2.혹시 lock()함수가 lucy객체의 멤버 함수지만 리턴한건 해당 객체의 멤버 변수(여기선 m_partner)를 해당 객체인 lucy객체와 공동으로 소유중인 ricky객체를 리턴했는데 그렇다면 lock함수는 자신이 속한 객체 이외에 공동으로 소유중인 또 다른 객체를 리턴한다로 이해해도 되겠습니까? 답변 부탁드립니다. 감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-J 질문드립니다.
안녕하세요 큰돌님! 3-J번 Queue를 두번사용하지 않고 풀어봤는데요.단순히 0일경우 visited를 카운트 안하고1일경우에만 카운트하여 풀이를 해봤습니다. 예제는 전부 맞는데 제출하니 틀렸다고 나옵니다.어떤 부분을 놓친걸까요?또 어떤 반례가 있을까요? http://boj.kr/b6ecc8c40aa24dee8f2c8dc46e5b2486
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-J질문입니다!
의상 종류가 몇 개인지 알기 위해서 b를 _map[b]++;를 해주셨는데, int형인 cnt[]배열말고 자료구조 map을 쓴 이유가 들어가는 요소인 b가 string형이라서 map을 쓴건가요?for(char a : s) cnt[a - 'a']++; 가 가능한 이유는 요소가 문자일지라도 요소가 char형이기 때문인것이 맞나요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-J 문제 컴파일이 안돼요
안녕하세요 1-J 9375번 문제를 푸는데 계속 컴파일이 안돼요.devc++ 사용하고 있는데요, 강사님 코드로 컴파일 해도 오류가 나요. 뭐가 문제일까요?http://boj.kr/b8ffa79b7bbc43a7b291d205f9015698for(auto c : _map) 이 부분에서 [Error] 'c' does not name a type 이런 오류가 떠요.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 3-G 질문 있습니다!
안녕하세요 큰돌님.매번 좋은 강의 잘 듣고 있습니다. 수빈이의 좌표가 100,000으로 주어졌을 경우 *2 한 200,000까지 처리할 수 있도록 코드를 작성했다고 생각하는데,계속해서 메모리 초과로 실패합니다..혹시 제가 미쳐 신경쓰지 못한 부분이 있다면 지적해주시면 감사하겠습니다. http://boj.kr/094b02dd883548a88d9ca6d3fa2261cb
-
미해결홍정모의 따라하며 배우는 C++
3.9 답 공유?
2. myflags 0000option4 0001option5 0010 으로 가정했을 때, 첫번째 문제는 괄호안에 있는 것을 먼저 계산하면 0011 에서 ~(not)이니, 1100입니다. 두번째 문제는 연산자 우선순위로 각각에 ~을 먼저 계산 후 &를 풀면되는 데, 1110 & 1101으로 결과는 1100이 되니 결국 정답은 같습니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2주차 visited배열 타입관련 질문
안녕하세요 선생님 항상 질좋고 열정넘치는 강의를 만들어 주셔서 감사합니다 다름이 아니라 2주차 visited[]을 선언할 때 bool타입과 int형 두가지 타입을 쓰시는데 어떤 기준으로 두 가지 타입을 나눠 써야 하나요??
-
미해결홍정모의 따라하며 배우는 C++
22:15 두줄을 한줄로 할수 있다고 한 부분 답 질문!
비트 플래그 강의 중 22:15초 에 두 줄에서 한 줄로 줄여 사용할 수 있다고 한 부분이 있는 데,items_flag ^= opt2 | opt1;이거 맞나요???
-
해결됨홍정모의 따라하며 배우는 C++
얕은 복사시 소유권 박탈에 관한 질문
#include <iostream> //#include "autoptr.h" #include "autoptr2.h" #include "resource.h" #include "Timer.h" AutoPtr<Resource> generateResource() // AutoPtr<Resource> 타입을 리턴하는 함수 { // 10000000 의 length를 가진 Resource타입의 멤버를 가지는 AutoPtr 객체 생성 AutoPtr<Resource> res(new Resource(10000000)); return res; } int main() { using namespace std; streambuf* orig_buf = cout.rdbuf(); // cout.rdbuf(NULL); 화면에 출력되는 메세지들 끄기. 시간 어마어마하게 걸릴테니까 😎 Timer timer; { AutoPtr<Resource> main_res; main_res = generateResource(); // ⭐ generateResource() 리턴값은 R-value } cout.rdbuf(orig_buf); //cout << timer.elapsed() << endl; timer.elapsed();//실행시간 재서 출력 } 메인.cpp#pragma once #include <iostream> using namespace std; template<typename T> class AutoPtr { public: T* m_ptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { cout << "AutoPtr default constructor" << endl; } ~AutoPtr() { cout << "AutoPtr destructor" << endl; if (m_ptr != nullptr) delete m_ptr; } AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? } AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; } T& operator *() const { return *m_ptr; } T* operator ->() const { return m_ptr; } bool inNull() const { return m_ptr == nullptr; } };AutoPtr.h#pragma once #include <iostream> using namespace std; class Resource { public: int* m_data = nullptr; unsigned m_length = 0; public: Resource() // 기본 생성자 { cout << "Resource constructed" << endl; } Resource(unsigned length) // 일반 매개변수 1개 생성자 { cout << "Resource length constructed" << endl; this->m_data = new int[length]; this->m_length = length; } Resource(const Resource& res) // 💎복사 생성자💎 { cout << "Resource copy constructed" << endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) // 내용물을 전부 깊은 복사 (시간이 꽤 걸림) m_data[i] = res.m_data[i]; } ~Resource() // 소멸자 { cout << "Resource destroyed" << endl; } Resource& operator = (Resource& res) // 💎대입 연산자 오버로딩💎 { cout << "Resource copy assignment" << endl; if (&res == this) return *this; // 대입하려는게 자기 자신이면 아무것도 안함 if (this->m_data != nullptr) delete[] m_data; // 1. 내 자신의 m_data 비워주기 m_length = res.m_length; // 2. 대입으로 넘겨받은 res의 length 로 내 length 갱신 m_data = new int[m_length]; // 3. 비워진 내 자신의 m_data에 새로운 공간 할당받기 for (unsigned i = 0; i < m_length; ++i) // 4. m_data내용물 넣기. m_data[i] = res.m_data[i]; // 대입으로 넘겨받은 res의 m_data 내용물들을 **내 m_data**에 깊은 복사 return *this; } };Resource.h 위 3코드는 수업에 나온 코드입니다. 얕은 복사시에 강사님께서 소유권 박탈의 목적으로 매개변수로 받은 참조 객체의 private변수인 포인터변수를 꼭 nullptr로 초기화를 해주는것이 깔끔하다고 하셨습니다.예를 들면AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? }이나AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; }이 부분에서 a.m_ptr=nullptr;이렇게요. 질문1. nullptr로 초기화를 안시키면(소유권 박탈을 안하면) 문제가 생기나요?2.제가 찾아보니까 "박탈 시키지 않으면 대입 연산자 인수로 이 인스턴스를 참조 하게 된 매개 변수 AutoPtr && a가 대입 연산자 호출이 종료됨에 따라 소멸자가 호출되어 delete될 수 있기 때문이다." 라는 글을 어디서 봤는데 이게 무슨말인지 모르겠는데 맞는 말인가요??3.저 위의 코드에서 혹시 매개변수로 기능하는AutoPtr && a같은 매개변수 객체도 함수 호출시에정식적인 객체 처럼 생성자와 소멸자를 호출하나요?안하는걸로 알고있고 안하기 때문에 2번 질문이 이해가 안되서 질문하는거거든요.혹시 제가 햇갈리고 있나 싶어서 다시 질문드립니다.