Outdated/Algorithm Solution 67

[BOJ] 1431번 시리얼 번호

복기복잡한 정렬에서는 나중 조건부터 차례대로 정렬해나가면 깔끔한 코드를 작성할 수 있다. 그리고 항상 모듈을 올바르게 구현했는지 확인하자. 코드C++ 17 #include #include #include using namespace std; int N;string Serials[1000]; int Cal(const string& str){ int result = 0; for (char ch : str) { if (isdigit(ch)) result += ch - '0'; } return result;} int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; for (size_t i = 0; i < N; ..

[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..

[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이 짝수라면 ..

[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번 토마토

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

[BOJ] 11404번 플로이드

문제n(1 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다.모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오. 입력첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우..

[BOJ] 1967번 트리의 지름

문제트리(tree)는 사이클이 없는 무방향 그래프이다. 트리에서는 어떤 두 노드를 선택해도 둘 사이에 경로가 항상 하나만 존재하게 된다. 트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다. 이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다.이런 두 노드 사이의 경로의 길이를 트리의 지름이라고 한다. 정확히 정의하자면 트리에 존재하는 모든 경로들 중에서 가장 긴 것의 길이를 말한다.입력으로 루트가 있는 트리를 가중치가 있는 간선들로 줄 때, 트리의 지름을 구해서 출력하는 프로그램을 작성하시오. 아래와 같은 트리가 주어진다면 트리의 지름은 45가 된다. 입력파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)..