먼저, 출발을 위해서 무조건 첫 주유소에서는 주유를 해야 한다. 지금까지 가장 저렴한 가격을 배열에 저장하는데, min_price[i-1]와 price[i]를 비교해서 더 저렴한 가격을 min_price[i]에 저장한다. 배열 min_price에 저장된 가격과 주유소 간의 거리 배열 len을 각각 곱하면 최솟값이 나온다. #include #include #include #include using namespace std; long long len[100001] = { 0, }, price[100001] = { 0, }, min_price[100001]; int main() { int n; cin >> n; for (int i = 0; i > len[i]; for (int..
PS/BOJ
이 문제는 주어진 식에서 괄호를 적당히 쳐서 결과를 "최솟값"으로 만드는 것이다. 최솟값을 만드는 방법은 마이너스(-)가 한 번 나오면, 그 이후의 값을 모두 빼버리면 된다. 마이너스(-)가 한 번 나왔으면 isMinus를 true로 바꾸어주고 num에 저장된 숫자를 빼준다. #include #include #include using namespace std; int main() { string S; cin >> S; int ans = 0; string num; bool isMinus = false; for (int i = 0; i
S의 값을 최소화하기 위해서는, A 배열에서 가장 큰 값과 B 배열에서 가장 작은 값을 곱해주어야 최소화 할 수 있다. 따라서, A 배열은 오름차순, B 배열은 내림차순으로 바꾸어 서로 곱하면 된다. #include #include #include using namespace std; int cmp(int x, int y) { return x > y; } int main() { int n, k; cin >> n; int a[51], b[51]; for (int i = 0; i > a[i]; } for (int i = 0; i > b[i]; } sort(a, a+n); sort(b, b+n, cmp); int ans = 0; for (int i ..
이번 문제는 가치의 합이 주어졌을 때 그 합을 이루는 최소한의 동전 개수를 구하는 문제이다. 따라서, 그리디 알고리즘으로 풀 수 있다. 간단하게, 그리디 알고리즘은 각 단계에서 최적의 선택을 하는 방식으로 문제를 해결하는 방식이다. 알고리즘 풀이법은 1단계 선택절차를 통해 현 상태에서 최적의 선택을 하도록 한다. 2단계 적절성 검사를 통해 문제의 조건을 만족하는지 확인한 후 답을 도출한다. 최소한의 동전을 사용하려면, 최대한 가장 화폐단위가 큰 동전을 사용하면 된다. 가치의 합 K를 단위가 가장 큰 동전부터 나누어 개수를 세어주면 된다. #include #include #include using namespace std; int main() { int n, k; cin >> n >> k; vector a..
이번 문제는 정수 N을 입력했을 때 N을 1로 만들기 위해 필요한 최소한의 연산 횟수를 출력하는 문제이다. (N은 1보다 크거나 같다.) 문제에서는 아래의 3가지 조건을 제시했다. 1. X가 3으로 나누어 떨어지면, 3으로 나눈다. 2. X가 2로 나누어 떨어지면, 2로 나눈다. 3. 1을 뺀다. 무슨 말이냐하면, 1인 경우 그대로 0, 2인 경우 2/2 = 1과 2-1 = 1 두 가지가 존재한다. 다른 예로는 3이 1이 되려면, (3-1)/2 = 1과 3/3 = 1 두 가지가 존재한다. X에 따른 최소 연산 수를 계산해보면, 아래와 같다. 1 2 3 4 5 6 7 8 9 10 0 1 1 2 3 2 3 3 2 3 점화식을 정리해보면, dp[i] = dp[i/2] - 1 dp[i] = dp[i/3] - 1..
1. 문제 https://www.acmicpc.net/problem/1316 1316번: 그룹 단어 체커 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때 www.acmicpc.net 2. 접근 이 문제는 '그룹단어'의 개수를 찾아내는 문제인데, 이전에 나왔던 문자가 한 번 더 나오면 그룹단어에서 제외된다. 이 예시를 보면, aba abab abcabc a a만 그룹 단어이다. ab aa aca ba bb 위의 예시 또한 aca를 제외한 나머지가 그룹 단어이다. i j 0 1 2 ... a a b ... a[i] = a[j] 일 때 k..
1. 문제 https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 2. 접근 이 문제는 n개의 집을 R, G, B를 이용해 이웃과 겹치지 않게 칠하는데 드는 최소 비용을 구해야 한다. n번째까지 드는 비용을 구한 후 3개 중 최소 비용을 찾아내야 한다. 먼저 값을 입력받는 배열 input[1001][3]을 선언한 다음, input[i][0], input[i][1], input[i][2] 에서 i번째 집을 칠했을 때의 최소 비용을 ..
1. 문제 https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.net 2. 문제해석 소수인지 아닌지를 판단하는 함수를 만들어야 한다. int isPrime(int a) { if (a < 2) return -1; // 소수 아님 for (int i = 2; i*i
1. 문제 https://www.acmicpc.net/problem/10828 10828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net 2. 접근 스택이란 ? 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 자료구조 - push : 스택에 넣는 것 - pop : 스택에서 빼는 것 - size : 스택의 크기를 구하는 것 - empty : 스택이 비었는지 확인 - top : 스택의 가장 윗 데이터 반환 stack이 정의되어 있을 때, stack.append() : 리스트의 맨 끝에 원소 추가 stack...
1. 문제 https://www.acmicpc.net/problem/10809 10809번: 알파벳 찾기 각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출 www.acmicpc.net 2. 접근 find() : 문자열에서 특정 문자가 몇 번째에 위치해 있는지에 대한 값을 반환한다. (문자열에서만 사용, 리스트나 튜플은 index() 사용) 찾는 문자가 없는 경우, -1 반환 chr() : 아스키 숫자를 문자로 반환한다. 3. 정답 s=input() arr=list(range(97,123)) for x in arr : print(s.find(chr(x)))..