Coding Test/BOJ(63)
-
[BOJ] 1654번 | 랜선 자르기 (C++)
🔗문제 보러가기 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 www.acmicpc.net 🧑🏻💻풀이 과정 K개의 랜선들을 잘라, 동일한 길이로 N개 이상을 만든 경우의 수들 중 가장 긴 단위 길이를 찾으면 되는 문제입니다. 매개변수 탐색(Parametric Search)을 이용하여 풀 수 있습니다. 사실 매개변수 탐색이란 용어를 오늘 처음 들어봤는데, 내용을 보니 제가 알게 모르게 사용했던 방법이더군요. 알고리즘은 간단합니다. 배열(arr)에 저장되어 있는 K개의 랜선들을 오름차순 기준으로 정렬합니다. ..
2023.09.02 -
[BOJ] 1629번 | 곱셈 (C++)
🔗문제 보러가기 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 🧑🏻💻풀이 과정 처음 문제를 봤을 때는 문제가 원하는 게 뭐길래 실버 1일까 생각했는데, 주어진 숫자 범위가 모두 최대 2,147,483,647이더군요... 즉, \(O(n)\) 알고리즘으로 작성하게 되면 최대 2,147,483,647(21억) 번 돌기 때문에, 시간 내로 절대 못 통과합니다. \( O(logN) \) 정도는 되어야 풀 수 있을텐데, 어떻게 할까 하다가 저는 2개씩 묶는 방법을 선택하였습니다. 2개씩 묶게 되면, 다음 두 가지 상황을 직면하게 됩니다. B가 짝수일 경우 \( \rightarro..
2023.09.01 -
[BOJ] 1780번 | 종이의 개수 (C++)
🔗문제 보러가기 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수 www.acmicpc.net 🧑🏻💻풀이 과정 🔗1992번 문제와 비슷한데, 4개의 분할에서 9개로 늘었다는 점만 다른 것을 빼면 풀이는 똑같습니다. 정말로 똑같아서, 따로 적을 말이 없네요... ✏️소스 코드 및 결과 #include #include #include #define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); using namespace std; const int ALL_..
2023.08.31 -
[BOJ] 1992번 | 쿼드트리 (C++)
🔗문제 보러가기 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또 www.acmicpc.net 🧑🏻💻풀이 과정 🔗2630번 문제와 유사하게 풀 수 있습니다. 전체 2차원 배열을 image라고 하고, 현재 탐색 중인 사각형 영역의 제일 왼쪽 위 시작점을 (rowBegin, colBegin)이라고 하겠습니다. \(N \times N \) 크기부터 시작하여 Top-down으로 내려 간다. N == 1이라면, 정답 문자열에 현재 색깔(image[rowBegin][colBegin])을 추가하고 종료한다. N != 1이라면, 현재 사각..
2023.08.31 -
[BOJ] 2630번 | 색종이 만들기 (C++)
🔗문제 보러가기 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net 🧑🏻💻풀이 과정 맨 처음에는 \( N \times N \) 크기의 색종이부터 시작하여 주어진 정사각형 내의 색깔들이 모두 같은 색깔인지를 볼 겁니다. 이 때, 선택지는 두 가지로 나뉘게 됩니다. 주어진 범위 내의 색깔이 모두 같은가? \( \rightarrow \) 해당 색깔 개수 +1하고, 종료 색깔이 같지 않은가? \( \rightarrow \) 주어진 범위의 사각형을 4등분하여 다시 탐색 시작 정사각형 탐색은 맨..
2023.08.31 -
[BOJ] 11053번 | 가장 긴 증가하는 부분 수열 (C++)
🔗문제 보러가기 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 🧑🏻💻풀이 과정 최장 증가 부분 수열(LIS) 알고리즘은 저에겐 처음 접해보는 개념이었습니다. 그래서 해당 개념에 대해 먼저 공부하였고, 기존 \( O(n^2) \)의 시간복잡도를 가지는 알고리즘을 이진 탐색(Binary Search)을 활용하여 \( O(nlogn) \)으로 줄이는 방법에 대해서도 알게 되었습니다. (🔗참고 블로그) 방법은 다음과 같았습니다. 최장 증..
2023.08.29