전체 글 153

[BOJ] 3101번 토끼의 이동

복기타입에 주의하자... 코드C++ 17 #include using namespace std; long long Sigma(int N){ return 1LL * N * (N + 1LL) / 2LL;} int main(){ int N, K, R = 0, C = 0; scanf("%d %d\n", &N, &K); long long result = 1; for (int i = 0; i < K; i++) { switch (getchar()) { case 'U': --R; break; case 'D': ++R; break; case 'L': --C; break; default: ++C; } // 좌표를 이용해서 값을 얻어낼 수 있다. long long first, dist; if (R + C < N) { // 각..

[BOJ] 4948번 베르트랑 공준

복기에라토스테네스의 체는 boolean 배열을 이용하여 구한다. 코드C++ 17 #include #define LENGTH 1024 * 256 using namespace std; int N;bool Primes[LENGTH] = { false };int CountOfPrimes[LENGTH] = { 0 }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // 에라토스테네스의 체로 소수를 구한다. Primes[0] = Primes[1] = true; for (size_t i = 2; i < LENGTH; i++) { if (Primes[i]) continue; for (size_t j = i * 2; j < LE..

[Design Pattern] 브릿지 패턴(bridge pattern)

목차브릿지 패턴Pimpl 관용구정리하며참고자료 1. 브릿지 패턴개요브릿지 패턴(bridge pattern)은 구현부에서 추상층을 분리해 각자 독립적으로 변형과 확장이 가능하도록 하는 패턴이다. 브릿지 패턴을 적용하면 두 계층 모두 추상화된 상위 타입을 가지게 되고, 의존성은 상위 타입 간에만 이뤄지게 된다. 이를 통해 실제 의존성이 발생하더라도 서로의 구체 타입은 알 수 없도록 한다. 이렇게 되면 두 계층의 결합도가 약화되어, 양쪽 모두가 독립적으로 변경과 확장이 가능한 상태가 된다. 따라서 컴포넌트 간 다양한 조합이 가능할 때 효과적이다. 구조구조는 다음과 같다. 실제 구현은 모두 인터페이스에 위임(delegation)하는 형태가 된다. 2. Pimpl 관례Pointer to Implementation..

Outdated/Column 2020.04.11

[Design Pattern] 팩토리 패턴(factory pattern)

목차생성자 다시보기팩토리정리하며참고자료 1. 생성자 다시보기생성자의 첫 번째 단점생성자에게는 두 가지 단점이 있다. 첫 번째는 메소드 이름이 항상 타입과 같은 이름을 가져 이름에 추가적인 정보를 표시할 수가 없다는 것이다. 다음의 예시를 보자. 좌표점을 나타내기 위해 Point 클래스를 설계하였고, 직교 좌표계와 극 좌표계를 모두 지원하려고 한다. class Point{ float x, y; float distance, radian; public: // 직교 좌표계를 위한 생성자 Point(float x, float y) : x{ x }, y{ y } { // ... } // 극 좌표계를 위한 생성자 Point(float distance, float radian) : distance{ distance }..

Outdated/Column 2020.03.24

[BOJ] 1024번 수열의 합

복기가우스 수열...정말.. 코드C++ 17 #include using namespace std; int N, L; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N >> L; // 이 문제는 가우스 수열을 이용해야 한다. // N을 L개의 수열로 구성한다고 할 때, // 1. L이 홀수라면 // 중간 값을 K라고 할 때, 수열은 다음과 같은 형식이 된다. // K - A, K - A + 1, ... , K , ... , K + A - 1, K + A (A = (L - 1) / 2) // 위의 수열을 역순으로 배치한 수열과 더해주면 2KL = 2N 즉, KL = N이 된다. // 2. L이 짝수라면 ..

[Design Pattern] 프로토타입 패턴(prototype pattern)

목차프로토타입 패턴이란?복사 연산 이용하기직렬화팩토리 패턴과의 결합정리하며참고자료 1. 프로토타입 패턴이란?객체를 생성할 때 종종 다른 객체의 값을 복사하여 사용할 때가 있다. 특히, 객체의 멤버 중 공통된 부분이 있다면 이것을 일일이 초기화 하기 보다는 어떤 객체를 잘 설정해놓고 복사하는 편이 효율적이다. 프로토타입 패턴(prototype pattern)은 그 이름에서 유추할 수 있듯 어떤 객체에 대한 프로토타입을 만들어 놓고 그것을 복사하는 패턴이다. C++로 프로토타입을 구현하는 방법에는 2가지가 있다. 하나는 복사 연산을 이용하는 것이고, 다른 하나는 직렬화를 사용하는 것이다.2. 복사 연산 이용하기복사 연산을 이용한 프로토타입 패턴 구현은 아래와 같이 될 것이다. class Undergradua..

Outdated/Column 2020.03.22

[BOJ] 2660번 회장 선출

복기처음에 플루이드-와샬 알고리즘을 써야 한다는 것이 떠오르지 않았다. 나중에 생각나서 적용했는데, 그 뒤 회장의 점수와 횟수를 구하는데 너무 복잡하게 풀었다. 단순 명료하게, 오버 엔지니어링 하지 않도록 주의하자. 코드C++ 17 #include #include using namespace std; int N;int Costs[50][50];int Scores[50]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; while (true) { int a, b; cin >> a >> b; if (a == -1 && b == -1) break; Costs[a][b] = 1; Costs[b][a] =..

[BOJ] 1991번 트리 순회

복기Python3에서 f-string과 string.join()의 시간 차가 나지 않았다. 하지만 문자열을 구성하는 측면에서는 f-string이 좀 더 편했다. 또, f-string을 이용하니 코드 중복을 상당히 줄일 수 있었다. 세 가지 함수를 사용할 때보다 메모리 사용량과 시간 모두 줄일 수 있었다. 코드C++ 17 #include #include using namespace std; using Node = pair; int N;vector Tree(26); constexpr size_t GetIndex(char node){ return node - 'A';} void InsertToTree(char root, char left, char right){ int index = GetIndex(root)..

[BOJ] 7569번 토마토

문제철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자모양 상자의 칸에 하나씩 넣은 다음, 상자들을 수직으로 쌓아 올려서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지 그 최소 일수를 알고 싶어 한다..