코딩테스트/Baekjoon 59

[백준 #2231] 분해합 (C++)

https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net num이 0이 아닐 때까지 10으로 나눈 나머지 값을 sum에 더하고, 10으로 나눈 몫을 num에 다시 넣어주는 것을 반복한다. 즉, num의 각 자릿수를 더하는 것이다. 그다음 각 자릿수를 더한 값과 i 값이 입력받은 n이라면 생성자를 구한 것이기 때문에 result에 i의 값을 넣어준다. 이 과정을 0부터 입력받은 숫자까지 차례대로 하다가 생성자가 발견되면 이를 ..

[백준 #2164] 카드2 (C++)

https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net 제일 위에 있는 카드를 바닥에 버릴 것이기 때문에 queue를 사용했다. (First In First Out) 맨 처음 n을 입력받고 for 문을 사용해 1부터 n까지 queue에 넣어준다. 그다음 pop()을 사용해 가장 먼저 입력한 숫자를 삭제하고, 그다음 제일 위에 있는 숫자를 front()로 반환하여 tmp에 넣어준 뒤 pop()을 통해 해당 숫자를 삭제하고 push(tmp)를 이용해 tm..

[백준 #5565] 영수증 (C++)

https://www.acmicpc.net/problem/5565 5565번: 영수증 첫째 줄에 10권의 총 가격이 주어진다. 둘째 줄부터 9개 줄에는 가격을 읽을 수 있는 책 9권의 가격이 주어진다. 책의 가격은 10,000이하인 양의 정수이다. www.acmicpc.net 처음에 10권의 총 가격을 입력하고, 다음으로 입력하는 책 가격들을 순차적으로 빼주면 가격을 읽을 수 없는 책의 가격을 알 수 있다. #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int sum, price; cin >> sum; for (int i = 0; i > price; sum -= pr..

[백준 #6603] 로또 (C++)

https://www.acmicpc.net/problem/6603 6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 www.acmicpc.net k개의 수만큼 수를 입력하여 벡터 v에 넣어주었다. 그다음 k개 중 6개를 출력하기 위해 벡터 tmp에 k개의 수 중 6개에 1을, 나머지 (k-6) 는 0을 넣어주었다. (만약 k가 7이라면 tmp는 {1, 1, 1, 1, 1, 1, 0}이 되는 것이다) 그다음 do-while 문을 이용해 tmp 현재에 이전 순열이 있으면 for 문을 실행하여 tmp의 i번째 요소가 1일 경우, 벡터..

[백준 #10972] 다음 순열 (C++)

https://www.acmicpc.net/problem/10972 10972번: 다음 순열 첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net algorithm 헤더 파일에 정의된 next_permutation()을 사용하여 문제를 풀었다. next_permutation()은 다음 순열이 없다면 false를 반환하고 현재 순열의 다음 순열이 있다면 이를 구하고 true를 반환한다. 따라서 if 문을 사용해 다음 순열이 있으면 그것을 출력하고, 입력한 순열이 사전 순으로 마지막에 오는 순열이면 -1을 출력했다. #include #include #include using namespace std; i..

[백준 #10973] 이전 순열 (C++)

https://www.acmicpc.net/problem/10973 10973번: 이전 순열 첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net algorithm 헤더 파일에 정의된 prev_permutation()을 사용하여 문제를 풀었다. prev_permutation()은 이전 순열이 없다면 false를 반환하고 현재 순열의 이전 순열이 있다면 이를 구하고 true를 반환한다. 따라서 if 문을 사용해 이전 순열이 있으면 그것을 출력하고, 입력한 순열이 사전 순으로 가장 처음에 오는 순열이면 -1을 출력했다. #include #include #include using namespace st..

[백준 #1010] 다리 놓기 (C++)

https://www.acmicpc.net/problem/1010 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net 강의 서쪽에는 n개의 사이트, 동쪽에는 m개의 사이트가 있고 이를 연결한 다리를 최대한 많이 짓기 위해 n개의 다리를 지으려고 할 때의 경우의 수를 구하는 문제이다. m개 중에서 순서에 상관없이 n개를 선택하는 것이기 때문에 조합을 사용하여 문제를 풀었다. n, m 순서로 입력받지만 m개 중에서 n개를 선택하는 것이므로 mCn = m-1Cn-1 + m-1Cn로 문제를 풀어야 한다. #include..

[백준 #2675] 문자열 반복 (C++)

https://www.acmicpc.net/problem/2675 2675번: 문자열 반복 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다 www.acmicpc.net 입력받은 문자열을 문자 배열로 만든 후 이중 for 문을 사용하여 문자 하나 당 r번씩 출력되게 했다. #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int t, r; string s; cin >> t; for (int i = 0; i > r >> s..

[백준 #2908] 상수 (C++)

https://www.acmicpc.net/problem/2908 2908번: 상수 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 www.acmicpc.net 입력받은 숫자를 뒤집기 위해 to_string 함수를 사용하여 문자열로 변환 후 reverse 해주었다. 그리고 뒤집은 문자열을 다시 정수로 변환하기 위해 atoi 함수를 사용하였다. 그 후 두 개의 수 중 더 큰 값을 출력하기 위해 max를 사용했다. #include #include #include using namespace std; int main() { ios::sync_with_stdio(false)..