본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

(220)
[c++] 백준 1174 줄어드는 수 [문제] https://www.acmicpc.net/problem/1174 1174번: 줄어드는 수 음이 아닌 정수를 십진법으로 표기했을 때, 왼쪽에서부터 자리수가 감소할 때, 그 수를 줄어드는 수라고 한다. 예를 들어, 321와 950은 줄어드는 수이고, 322와 958은 아니다. N번째로 작은 줄어드는 www.acmicpc.net [풀이] 여러 사람의 코드를 참고해서 풀었는데...이런 생각 도대체 어떻게 뚝딱뚝딱 하는지... 먼저 줄어드는 수 중 가장 최대값은 9876543210이다. 즉 모든 수가 중복될 수 없으므로 경우의 수는 2^10 = 1024 밖에 안된다는 것. 따라서 줄어드는 수에 해당하는 모든 값을 구한 후 정렬하고, n번째에 해당하면 그 수를 출력 그 범위를 넘어서면 -1을 출력하면 된..
[c++] 백준 1106 호텔 - 동적계획법 [문제] https://www.acmicpc.net/problem/1106 1106번: 호텔 첫째 줄에 C와 형택이가 홍보할 수 있는 도시의 개수 N이 주어진다. C는 1,000보다 작거나 같은 자연수이고, N은 20보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각 도시에서 홍보할 때 www.acmicpc.net [풀이] 동적계획법(dp) 문제이다.(dp에 대한 감을 아예 잃어서 뻘짓만 했다...) dp[i] = i만큼의 비용을 들여 확보할 수 있는 최대 고객 수 라고 해보자. C는 최대 1000이고, 도시를 홍보하는 최대 비용은 100이다. 100에 고객 1명을 확보할 수 있다면 1000명의 고객을 확보하는데 필요한 비용, dp의 최대 크기는 1000*100+1이 된다. 따라서 dp[1000..
[c++] 백준 1052 물병 [문제] https://www.acmicpc.net/problem/1052 1052번: 물병 지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번 www.acmicpc.net [풀이] 2의 거듭제곱은 하나의 물병으로 합칠 수 있는 수이다. 64 = 32+32 = 16+16+16+16 = ... = 1+1+.....+1 이기 때문에 한 병으로 만들 수 있다. 따라서 가능한 최대의 2의 거듭제곱 수를 구한 후 n에서 빼주고 동시에 k도 1씩 감소시켜준다. k가 1이 될 때까지 위의 과정을 반복한 후, k가 1이 되면 남아있는 n이 물병 한 개로 옮길 수 있는 2의 거듭..
[c++] 백준 1019 책 페이지 [문제] https://www.acmicpc.net/problem/1019 1019번: 책 페이지 첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다. www.acmicpc.net [풀이] 먼저 [A, B] 사이에 0~9가 등장한 횟수를 세는 것으로 생각해야 한다. A의 1의 자리가 0이고 B의 1의 자리가 9라면 그 사이에 0~9가 등장한 횟수는 공통적으로 B/10-A/10+1이 된다. 예를 들어, [22, 315] 라고 하면 처음 1의 자리가 0이 될 때까지 A를 증가시킨다. 이때의 값은 직접 계산해준다. 마찬가지로 B의 1의 자리가 9가 될 때까지 감소시켜주고, 그때까지의 횟수는 직접 계산한다. [30, 309]가 되면 30~..
[기출 상] E-Queen - 백트래킹 [문제] nqueen 문제의 변형으로 절대 놓을 수 없는 k개의 위치 정보가 추가로 주어질 때의 queen이 서로 공격할 수 없게 배치할 수 있는 경우의 수가 최대 몇 개인지를 리턴한다. [코드] #include using namespace std; int col[16]; bool xy[14][14] = {false, }; int n, result; bool check(int level) { for (int i = 0; i < level; i++) if (col[i] == col[level] || abs(col[level] - col[i]) == level - i) return false; //col[i]: x좌표, i: y좌표. (x, y)와 (a, b)에 대해서 두 좌표가 대각선에 위치한다면 a-x ..
[기출 상] 집으로 가는 길(사다리 타기 문제) - 정렬 [문제] 초기의 사람 배치 순서를 입력받아 각 사람이 자신의 집으로 돌아갈 수 있게 하는 최소 개의 다리의 수를 return 하도록 해라. 예를 들어 [3, 2, 1, 4] 의 순서대로 있는 사람이 [1, 2, 3, 4]의 자신의 집으로 돌아가기 위해 놓아야 하는 최소한의 사다리 개수는 3개이다. [풀이] 사다리 문제의 규칙을 알아내는 것이 중요하다. 사람이 3, 2, 1, 4의 순서로 배치되어있다고 하자. 3과 2 사이에 사다리를 하나 놓으면 [2, 3, 1, 4]로 사다리 왼쪽, 오른쪽 순서가 바뀌는 것을 알 수 있다. 3과 1 사이에 하나 더 놓으면 [2, 1, 3, 4]로, 2와 1 사이에 하나 더 놓으면 [1, 2, 3, 4]로 순서가 바뀌므로 최소 3개의 사다리를 놓아야 한다. 따라서 이는 정..
[기출 상] 주울 수 있는 최대 돈 1 - 동적계획법 [문제] 일렬로 놓아진 돈에 대해서, 연속으로 3개의 돈을 가질 수 없을 때 최대로 주울 수 있는 돈의 액수를 구하는 프로그램을 작성해라. [풀이] 동적계획법 문제로 이전에 풀었던 포도주 시식 문제와 동일하다. https://stritegdc.tistory.com/44 [c++] 백준 2156 포도주 시식 백준 단계별로 풀어보기 [동적계획법 1] 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도 stritegdc.tistory.com [코드] #include #include #define max(x,y) (x>y)?x:y using namespace std; /..
[기출 상] N개의 작업공정 - 위상정렬 [문제] N개의 작업공정이 있다. 공정마다 소요시간이 있고, 선행관계가 있다면 반드시 선행 공정이 끝나야만 다음 공정으로 넘어갈 수 있다. 임의로 주어지는 공정에 대해 목표되는 공정까지 소요되는 최소시간을 구하는 프로그램을 작성하라. 첫째줄에 공정수(N), 관계수(R)를 입력한다. 그 다음줄에 공정에서 소요되는 시간 N개를 입력하고, 그 다음 줄부터 공정간의 관계를 R줄에 걸쳐 입력한다. 공정간의 관계는 "선행공정번호 후행공정번호"순으로 입력한다. 그 다음줄에 목표되는 공정 번호를 입력한다. [풀이] 공정 간 선후행관계가 있고, 이를 반드시 지켜야하므로 위상정렬 알고리즘을 이용해 풀 수 있다. 먼저 진입차수가 0이면 선행공정이 없다는 의미이므로 time[i]에 n[i] 값을 넣는다.(time[i]는 i ..