[백준 1786번] - 찾기(C/C++)
2022. 11. 7. 00:55
Problem Solving/백준
1786번: 찾기 첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m www.acmicpc.net [문제 설명] [문제 풀이] 해당 문제는 KMP알고리즘을 이용하여 문자열 패턴 매칭을 하는 문제이다. 따라서 KMP 알고리즘에 대한 이해가 필요하다. 혹시 해당 알고리즘에 대해 잘 모른다면 아래 포스트를 참고하길 바란다. [Algorithm] - 문자열 탐색 알고리즘 : KMP 이론 KMP 알고리즘이란, 문자열 탐색 알고리즘으로써 알고리즘을 만든 사람들(Knuth-Morris-Pratt)의 앞글자를 딴 것이다. 웹페이지에서 ctrl + F를 이용하여 문자열..
[백준 2252번] - 줄세우기(C/C++)
2022. 10. 14. 09:55
Problem Solving/백준
2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의 www.acmicpc.net [문제 설명] [문제 풀이] 이 문제를 풀기전에 위상정렬 알고리즘에 대해 알고 있으면 쉽게 풀 수 있다. 위상정렬 알고리즘에 대해 잘 모른다면 아래 포스트를 읽고오면 푸는데 도움이 될 것이다. [Algorithm] - Topology Sort(위상정렬) 위상정렬(Topology Sort) 란 ? 위상(Topology)이란, 노드들을 물리적으로 연결해 놓은것을 의미한다. 위상 정렬이라는것은, 위 처럼 노드들을 연결해놓은 ..
[백준 11779번] - 최소비용 구하기 2(C/C++)
2022. 10. 5. 00:49
Problem Solving/백준
11779번: 최소비용 구하기 2 첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스 www.acmicpc.net [문제 설명] [문제 풀이] 다익스트라 알고리즘 관련 문제이다. 만약, 다익스트라 알고리즘에 대해 잘 모른다면, 아래 포스트를 먼저 보고오는것이 좋다. [Algorithm] - Dijkstra(다익스트라) 알고리즘 이론 Dijkstra(다익스트라) 알고리즘이란, 그래프의 한 정점에서 모든 정점까지의 최단 거리를 각각 구하는 알고리즘(최단경로 문제)이다. 처음 작성된 알고리즘은 시간복잡도 O(N^2)을 가지는데, mocha-bro.t..
[백준 12865번] - 평범한 배낭(C/C++)
2022. 9. 3. 23:38
Problem Solving/백준
12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net [문제 설명] [문제 풀이] 다이나믹 프로그래밍 문제 중 유명한 유형인 Knapsack Problem(배낭 문제)이다. 물건들은 각각 무게(W)와 가치(V)를 가지고 있다. 배낭에 넣을수 있는 무게의 한계(K)가 정해져있고, 무게 한도 안에서 넣을수있는 물건들(N)의 가치합의 최댓값을 구하면 된다. 물건들을 처음부터 차례로 확인한다. 2차원 배열 dp를 선언하여 dp[물건 인덱스][무게]의 가치의 ..
[백준 11000번] - 강의실 배정(C/C++)
2022. 9. 3. 23:35
Problem Solving/백준
[문제 설명] [문제 풀이] 풀다보니.. 답을 맞추긴 했지만.. 코드가 좀.. 그렇다.. 다른 사람들을 봤을때 우선순위 큐를 사용해서 문제를 푼거같은데.. 나중에 한번 다시 풀어봐야겠다. 내가 문제를 푼 방식은 아래와 같다. 1. sort함수를 사용해서 시작 시간이 빠른 순서로, 시작 시간이 같다면 강의 시간이 짧은 순서로 정렬했다. 2. isvisited 배열을 선언하여 방문 여부를 체크한다. 3. 방문하지 않은 인덱스일 경우 count를 증가시킨다. 4. 현재 강의가 끝나는 시간보다 큰 시작 시간을 갖는 인덱스를 lower_bound를 통해 구한다. 5. 찾은 인덱스가 방문하지 않은 곳이라면 방문 상태로 변경하고, 방문한 곳이라면 인덱스를 하나 증가시켜서 다시 확인한다. 6. lower_bound로 ..
[백준 2011번] - 암호코드 (C/C++)
2022. 9. 3. 23:33
Problem Solving/백준
2011번: 암호코드 나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다. www.acmicpc.net [문제 설명] [문제 풀이] 조건을 잘못 적용해서 엄청 틀렸다.. 문제를 푼 방식은 아래와 같다. 길이에 따라 암호 해석 가짓수를 저장할 배열 dp를 선언한다. 1. 앞에서부터 차례로 문자를 확인한다. 2. 현재 문자가 '0'인지를 확인한다. 2-1. 문자가 '0'이 아니라면 dp[i+1] += dp[i] ( 1(A) -> 11(AA)의 경우) 3. 이 전 문자가 '1'이거나 '2'이면서 현재 문자가 '0' ~ '6' 사이라면 dp[i+1] += dp[i-1] ( 0 -> 11(..
[백준 5427번] - 불(C++)
2022. 8. 16. 13:06
Problem Solving/백준
5427번: 불 상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에 www.acmicpc.net [문제 설명] 상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다. 빌딩의 지도가 ..
[백준 9095] - 1, 2, 3 더하기(C++)
2022. 8. 14. 23:19
Problem Solving/백준
9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net [문제 설명] 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. 예제 입력 1 복사..
[백준 6603번] - 로또(C++)
2022. 8. 14. 23:06
Problem Solving/백준
6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34..
[백준 11727번] - 2xn 타일링 2(C++)
2022. 8. 10. 18:58
Problem Solving/백준
11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net [문제 설명] 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 예제 입력 1 복사 2 예제 출력 1 복사 3 예제 입력 2 복사 8 예제 출력 2 복사 171 예제 입력 3 복사 12 예제 출력 3 복사 2731 [문제 풀이] 백준..
[백준 11726번] - 2xn 타일링(C++)
2022. 8. 10. 18:16
Problem Solving/백준
11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net [문제 설명] 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 예제 입력 1 2 예제 출력 1 2 예제 입력 2 9 예제 출력 2 55 [문제 풀이] 다이나믹 프로그래밍에 대한 감을 잡기에 좋은 문제같다. 다른..
[백준 1463번] - 1로 만들기
2022. 7. 30. 16:53
Problem Solving/백준
1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net [문제 설명] 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 0.15 초 (하단 참고) 128 MB 209950 68556 43766 32.177% 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟..