본문 바로가기

Problem Solving/BOJ 백준

(132)
[ BOJ 백준 1654번 - 랜선 자르기 ] 해설 및 코드 https://www.acmicpc.net/problem/1654 목적 K개의 랜선을 최대 길이로 잘라 N개의 랜선을 만들자. 접근법 1. 길이를 1늘리거나 1줄이는 방법으로는 시간초과에 걸릴 것이다. 이분 탐색 알고리즘을 이용하자. (이분 탐색 과정 참고 : 백준 2110 - 공유기 설치) 2. 주어진 조건에 의해 int 자료형의 범위를 벗어나는 경우가 존재하기 때문에, 더 큰 범위의 자료형을 사용한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include using namespace std; int k,n,a[10001],ret; void bs(unsigned l,unsig..
[ BOJ 백준 2512번 - 예산 ] 해설 및 코드 https://www.acmicpc.net/problem/2512 목적 지방예산을 모두 더해서 국가예산에 최대한 가깝게 만들 수 있도록 상한액을 정하라. 접근법 1. 상한액을 1씩 더하거나 빼서 구하려고 하면, 시간초과가 발생하므로 이분 탐색 알고리즘을 이용하여 접근한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include #include using namespace std; int n,m,a[10001],ret; void bs(int l,int r){ if(l>r){ ret=r; return; } int h=(l+r)/2; long long k=0; for(int i=0;i..
[ BOJ 백준 2805번 - 나무 자르기 ] 해설 및 코드 https://www.acmicpc.net/problem/2805 목적 절단기에 설정한 높이 h 이상의 나무만 잘라 그 합이 m이상이 되도록 하는 h를 구하자. 접근법 1. 절단기의 높이를 1씩 늘리거나 줄여서 찾기에는 높이의 범위가 너무 크므로, 이분 탐색 알고리즘으로 접근한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include #include using namespace std; int n,m,a[1000001],ret; void bs(int l,int r){ if(l>r){ ret=r; return; } int h=(l+r)/2; long long k=0; for(in..
[ BOJ 백준 1022번 - 소용돌이 예쁘게 출력하기 ] 해설 및 코드 https://www.acmicpc.net/problem/1022 목적 아래 그림과 같이, 소용돌이를 출력하려는 수들 중에 가장 길이가 긴 수에 서식을 맞추어 오른쪽 정렬로 출력한다. 접근법 1. 만약, i, j가 있고, 두 수중에 절대값의 최대값이 2이라면, i, j에 해당하는 수는 다음과 같은 테두리 형태의 수들 중 하나일 것이다. 2. 위 테두리는 i와 j의 값이 2인지 -2인지에 따라 각 꼭지점을 기준으로 아래와 같이 네 부분으로 나눌 수 있다. 3. 이미 위의 그림까지 보면 공식을 도출해 낼 수 있을 것이다. 우측하단 꼭지점인 (n, n)에 해당하는 값은 (2*n+1)^2로 나타낼 수 있다. 시계방향으로 다음의 꼭지점은 이전 꼭지점에서 2*n 만큼 감소한 값이다. 1 2 3 4 5 6 7 8 9..
[ BOJ 백준 3005번 - 크로스워드 퍼즐 쳐다보기 ] 해설 및 코드 https://www.acmicpc.net/problem/3005 목적 퍼즐에서 사전순으로 제일 앞서는 단어를 구한다. 접근법 1. 가로방향으로 놓인 단어를 찾아서 앞서는 단어 갱신 2. 세로방향으로 놓인 단어를 찾아서 앞서는 단어 갱신 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include using namespace std; int r, c; char p[22][22]; string ret=""; void find(int a,int b,bool d) { for (int i = 0; i tmp) ret = tmp; tmp = ""; } else tmp.push_back(ref); } } ..
[ BOJ 백준 1725번 - 히스토그램 ] 해설 및 코드 https://www.acmicpc.net/problem/1725 1725번: 히스토그램 문제 히스토그램에 대해서 알고 있는가? 히스토그램은 아래와 같은 막대그래프를 말한다. 각 칸의 간격은 일정하고, 높이는 어떤 정수로 주어진다. 위 그림의 경우 높이가 각각 2 1 4 5 1 3 3이다. 이러한 히스토그램의 내부에 가장 넓이가 큰 직사각형을 그리려고 한다. 아래 그림의 빗금 친 부분이 그 예이다. 이 직사각형의 밑변은 항상 히스토그램의 아랫변에 평행하게 그려져야 한다. 주어진 히스토그램에 대해, 가장 큰 직사각형의 넓이를 구하는 프로그램을 www.acmicpc.net 목적 왼쪽과 그림과 같은 히스토그램에서 오른쪽 그림과 같은 직사각형 넓이의 최대값을 구한다. 접근법 1. 분할정복 알고리즘으로 접근하자...
[ BOJ 백준 2104번 - 부분배열 고르기 ] 해설 및 코드 https://www.acmicpc.net/problem/2104 2104번: 부분배열 고르기 문제 크기가 N(1≤N≤100,000)인 1차원 배열 A[1], …, A[N]이 있다. 어떤 i, j(1≤i≤j≤N)에 대한 점수는, (A[i]+…+A[j])×Min{A[i], …, A[j]}가 된다. 즉, i부터 j까지의 합에다가 i부터 j까지의 최솟값을 곱한 것이 점수가 된다. 배열이 주어졌을 때, 최대의 점수를 갖는 부분배열을 골라내는 프로그램을 작성하시오. 입력 첫째 줄에 정수 N이 주어진다. 다음 줄에는 A[1], …, A[N]을 나타내는 정수들 www.acmicpc.net 목적 어떤 i, j(1≤i≤j≤N)에 대하여, (A[i]+…+A[j])×Min{A[i], …, A[j]} 와 같은 식의 최대값을 ..
[ BOJ 백준 6359번 - 만취한 상범 ] 해설 및 코드 https://www.acmicpc.net/problem/6359 6359번: 만취한 상범 문제 서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다. 그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, ... 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, ... 번 방이 열려있으면 잠그고 www.acmicpc.net 목적 1의 배수, 2의 배수, ...n의 배수에 해당하는 문을 열고 닫을 때(문의 이전 상태를 반전) 최종적으로 열려있는 문의 개수를..