본문 바로가기

C++ 코딩 문제 풀이/백준113

[Baekjoon] 9663번: N-Queen https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 해결 과정 착안 백트래킹(backtracking, 퇴각검색) 알고리즘에 대한 대표적인 문제이나, 직접 풀어보는 건 처음이라 백트래킹이 아직 익숙하지 않아서 착안이 어려웠다. 생각해내기 가장 어려웠던 부분은 단계별로 배치되는 퀸에 의해 8 방향 직선으로 가려지는 체스판 상의 위치를 어떻게 표시해야 문제를 쉽게 해결할 지를 생각해내는 것이었다. 그래서 처음에는 체스판을 계속 새로 만들고 퀸의 위치마다 직선 방향.. 2023. 6. 16.
[Baekjoon] 1463번: 1로 만들기 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 해결 과정 착안 자연수 $n=1, 2, ..., N$ 에 대해 $n=1$ 부터 반복문을 통해 $n$의 값을 증가시키면서 $3n, 2n, n+1$ 에 대한 연산 횟수의 값을 동적계획법(dynamic programming)을 통해 최솟값으로 갱신함으로써 문제를 해결하고자 했다. 구현 주어지는 수 $N$ 보다 큰 수에 대해서는 계산할 필요가 없으므로, $n=i$ 일 때, $3i, 2i, i+1$ 의 값이 $N$ 보다 작거나 같을 때에만 계산을 하도록 하였다. $3i, 2i, i+1$ 의 연산 횟수가 이미 계산되.. 2023. 6. 15.
[Baekjoon] 11866번: 요세푸스 문제 0 https://www.acmicpc.net/problem/11866 11866번: 요세푸스 문제 0 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) www.acmicpc.net 문제 해결 과정 착안 입력받은 $N$ 과 $K$ 의 값에 따라 큐(queue) 자료 구조를 사용해 요소를 하나씩 dequeue하고 반복문의 현재 루프가 $K$ 의 배수 번째에 해당하는 루프이면 숫자를 출력, 아니라면 다시 enqueue를 수행하여 문제를 해결하고자 했다. 구현 크기가 고정된 큐 자료 구조를 사용하며, enqueue 및 dequeue 연산을 반복적으로 수행하기 때문에 효율적인 메모리 활용을 위하여, 문제에 맞게 원형 큐(circular queue, 환형 큐) 자료 구.. 2023. 6. 14.
[Baekjoon] 11047번: 동전 0 https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) www.acmicpc.net 문제 해결 과정 착안 동전의 수를 최소화하기 위해 가능한 한 가장 높은 단위의 화폐부터 사용하여 주어지는 금액을 맞추고자 하였다. 구현 보유하고 있는 동전의 가치가 오름차순으로 주어지므로, 스택(stack) 자료 구조를 사용해 입력받는 순서로 동전의 가치가 맞추고자 하는 금액보다 작은 경우 이를 스택에 넣도록 구현하였다. 입력이 완료.. 2023. 6. 13.
[Baekjoon] 1874번: 스택 수열 https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 문제 해결 과정 착안 수열을 만들 수 있는지 확인하는 별다른 방법이 떠오르지는 않아, 문제에서 제시한 과정을 그대로 구현하여 문제를 해결하고자 하였다. 구체적으로는 아래와 같이 구현하고자 했다. 스택이 비어있거나 Top에 위치한 요소가 현재 수열의 항보다 작으면 push를 반복 (위 반복이 끝난 후) 스택의 Top에.. 2023. 6. 12.
[Baekjoon] 1181번: 단어 정렬 https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 문제 해결 과정 착안 정렬에 사용할 비교 연산자를 람다 표현식(lambda expression)을 활용한 이항 조건(binary predicate)으로 정의하여 문제를 해결하고자 하였다. 구현 편의상 STL의 헤더에 포함되어있는 std::sort() 함수를 사용하여 정렬하되, 람다 표현식을 활용해 이항 조건을 정의한 다음 함수에 전달하여 문제를 해결하였다. * 어제 포스팅했던 문제와 동.. 2023. 6. 11.