본문 바로가기

전체 글

(28)
[백준] 1038번 : 감소하는 수 https://www.acmicpc.net/problem/1038 💡 접근법이전에 사전 문제를 풀었던게 생각나서 그 문제랑 비슷하게 풀었다 ( https://www.acmicpc.net/problem/1256 ) 우선 이 문제를 두 단계로 분리하자면1. 지금 내가 찾는 숫자가 어떤 범위에 있는지 와 2. 실제 숫자가 뭔지를 찾는 두 단계로 나눠야 한다 1. 지금 내가 찾는 숫자가 어떤 범위에 있는지 찾기기본적으로 한 숫자가 정해지면, 그 뒤의 숫자들은 이 앞자리 숫자에 종속이 된다경우의 수들을 쭉 쓰다보면, 5421 라는 감소수는 4가 가장 앞자리인 숫자의 맨앞에 5를 더한 것과 같다5가 가장 앞자리인 4자리 숫자들 중, 그 다음 수가 4___ 인 경우의 수는, 4가 가장 앞자리인 3자리 수와 같다즉..
[백준] 1005번 : ACM Craft https://www.acmicpc.net/problem/1005 💡 접근법N은 10^3, D는 10^5 => 정답 영역은 10^8 (int 사용 가능)D는 0도 가능하다. 특정 노드에 도착했다고 바로 반환하면 안됨건설이 동시에 가능하다는 것이 독특하다. 선행 건물들 중 가장 큰 값만 채택하면 된다문제에서 지정한 건물만 지을 수 있으면 되기 때문에, 모든 건물을 지을 필요는 없다.역순으로 필수 건물부터 시작해서, BFS 로 조건 건물들을 순회하면 된다.이렇게 가다보면 조건이 없거나, 이미 건설된 경우에 반환된다 건설 순서에 따라, 이미 지은 건물일 수 있으며, 실행 순서에 따라 이전에 계산했던 값이 필요한 상황이 생긴다이전에 계산한 결과를 캐싱할 필요가 있다여러 횟수를 반복하기 때문에 데이터를 다시 세..
[백준] 2295번 : 세 수의 합 https://www.acmicpc.net/problem/2295 💡 접근법N은 1000보다 작은 값이지만, 시간 단위가 1초이기 때문에 시간 초과를 고려해야 한다 임의의 3개의 수를 어떻게 고를지가 관건인데 3, 4, 8, 10, 15, 18, 20 이라고 생각해보면{3,4,8} {3,4,10} {3,4,15} 이렇게 끝 값을 하나씩 옮겨가면서 처음에 케이스를 구하게 되는 걸 보면결국 2개의 값을 어떻게 구하는지가 중요하구나! 라는 생각이 들게 된다.2개를 구하고 저장해두었다면 그 값들만 가지고 만들 수 있는 수가 있는지만 찾으면 된다!2개의 덧셈 값을 구하고, 나머지 하나의 값을 끼워맞춘다덧셈 값을 일반 배열에 넣으면 중복값이 늘어날 것이기 때문에 set 자료구조를 사용하도록 하자이 문제의 조건에서..
다시 시작하자 벌써 3년차를 바라보고 있는 지금오랜만에 블로그를 켰다 사실 지금까지 공부를 게을리 하지는 않았지만내가 공부하는 내용들이 대부분 구글링해서 나온게 많다보니.. 이걸 올려봤자 똑같은 내용만 복제하는 기분이기도 했고괜히 잘못된 내용을 올렸는데 누가 뭐라고하면 어떡하지? 이런 걱정도 있었다 ㅎ 그래서 개인 노션에만 올리고 있었지만예전에 내가 쓴 블로그들을 읽다보니 그래도 과정에서 내가 얻은 것들이 많았다는 생각이 들더라누군가가 볼 수도 있다는 생각에 좀더 열심히 하게 되기도 하고!부끄럽지만 일단 다시 시작해볼까 한다 내가 뭘 생각했고 나만의 방법으로 어떻게 공부하는지 위주로 정리하려고 노력하자어차피 주저리주저리 써도 빈 내용이 있어서 다시 공부해야함ㅎㅎ꾸준히 조금씩 나아가자~
[Effective C++] 46: 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 포인트 모든 타입에 대해 암시적 타입 변환을 지원하는 템플릿과 관계가있는 함수를 제공하는 클래스 템플릿을 만들려고 한다면, 클래스 템플릿 안에 프렌드 함수로 정의한다 클래스 템플릿 안에 작성하면 인라인으로 정의되므로 도우미 함수를 따로 생성한다 정리 항목 24 : 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 와 관련이 있는 항목 ✔️ 이전의 예시를 템플릿으로만 바꿔주자 template class Rational { public: Rational (const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T ddenominator() const; }; template const Rat..
[Effective C++] 45: "호환되는 모든 타입" 을 받아들이는 데는 멤버 함수 템플릿이 직방! (처음엔 이름이 길다고 생각했지만 보면 볼수록 항목 이름을 간결하게 잘 지은 것 같다) 포인트 모든 타입을 받아들이는 멤버 함수를 만들려면 멤버 함수 템플릿을 쓰면 된다 복사 생성자와 복사 대입 연산자는 직접 선언해야 한다!! 정리 - 스마트 포인터 : 힙 기반 자원을 타이밍맞게 삭제해준다 (항목 13 참고) - 반복자 iterator : 단순연산을 지원한다 ( ++, -- 등) 포인터 : 암시적 변환을 지원함. 스마트포인터는 각 포인터들이 별개이기 때문에 변환 클래스를 직접 만들어야 한다 -> std::static_pointer_cast() 을 쓰면 Cast 가 되는 것 아닌가? 더보기 책이 옛날책이라 auto_ptr 을 사용하는 예시를 쓰고있다 ! 항목13에는 shared_ptr 이 tr1 라이브러리..
[Effective C++] 44: 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 포인트 템플릿으로 코드 비대화가 생긴다. (암시적이기 때문에) 템플릿 매개변수를 함수 매개변수나 멤버 데이터로 넣음으로써 해결할 수 있다. 동일한 이진 구조(long, int) 에 대해서는 한가지 함수 구현(void)을 공유하게 만든다. 정리 코딩 시간 절약, 코드 중복 회피라는 템플릿의 장점을 누리다보면 코드 비대화 (code bloat)가 발생한다. -> 코드 비대화 : 똑같은 애용의 코드와 데이터가 여러 벌로 중복되어 이진 파일로 구워진다) 코드 비대화를 해결하기 위한 방법 공통성 및 가변성 분석 어렵게 써놓았지만,, 코드 비대화를 해결하기 위해 평소에 코드의 비슷한 부분을 추려서 함수로 빼고, 그 부분이 필요한 곳에 함수들을 호출하도록 바꾸는 과정. 클래스와 템플릿에도 동일한 과정을 거치면 됨 그..
[Effective C++] 43: 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아두자 포인트 파생 클래스에서 기본 클래스 템플릿의 이름을 참조할 때는, this-> 를 붙이거나 기본 클래스 한정문을 명시적으로 써준다 예제 코드 (대부분은 비워놓은 내부 코드들) #include using namespace std; class CompanyA { public : void sendCleartext(const string& msg) {}; }; class CompanyB { public: void sendCleartext(const string& msg) {}; }; class CompanyZ { public: void sendCleartext(const string& msg) {}; }; class MsgInfo { }; template class MsgSender { public: void ..