본문 바로가기

반응형

PS

(325)
[BOJ] 백준 13913 숨바꼭질 4 (Swift) 문제 https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 풀이 X에서 X - 1, X + 1, 2 * X 의 방향으로 이동하는 경우 모두 1초가 걸리기 때문에, BFS로 최단비용를 구할 수 있습니다. 최단거리로 간 루트를 구하기 위해 visited라는 Int 배열을 선언하였습니다. 이 Int 배열의 index를 현재 위치, 값을 이전 위치로 사용하려고 합니다. 예를들어 visited[10] = 9 라면, 9에서 출..
[BOJ] 백준 9252 LCS 2 (Swift) 문제 https://www.acmicpc.net/problem/9252 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 풀이 이차원배열을 사용해 LCS의 길이를 구한 후, 오른쪽 구석에서 부터 탐색하여 문자열을 구할 수 있습니다. 소스코드 후기 LCS의 길이를 구하는 문제는 이미 풀어봤지만, 문자열을 어떻게 구할 수 있을지 2차원 배열을 확인하면서 풀이를 유추할 수 있었습니다.
[BOJ] 백준 14003 가장 긴 증가하는 부분 수열 5 (Swift) 문제 https://www.acmicpc.net/problem/14003 14003번: 가장 긴 증가하는 부분 수열 5 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net 풀이 N이 100만이므로 LIS를 $O(nlogn)$의 시간복잡도로 구하는 방식으로 풀이해야합니다. 이전 포스팅에서 길이를 구하였는데, 수열은 어떠한 방식으로 구할 수 있을까요? https://dev-mandos.tistory.com/245 [BOJ] 백준 12015 가장 긴 증가하는 부분 수열 2 (Swift) 문제 https://www.acmicpc.net/..
[BOJ] 백준 14002 가장 긴 증가하는 부분 수열 4 (Swift) 문제 https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 풀이 가장 긴 증가하는 부분 수열을 구하는 방법으로는 DP($O(n^2)$), 이분탐색($O(nlogn)$) 등의 방법이 있지만, N이 1,000이므로 DP를 사용해 $O(n^2)$으로도 풀이할 수 있습니다. 길이를 구하는 방법으로는 이전 포스팅에서 구한 방법으로 구할 수 있습니다. https://dev-man..
[BOJ] 백준 12852 1로 만들기 2 (Swift) 문제 https://www.acmicpc.net/problem/12852 12852번: 1로 만들기 2 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다. www.acmicpc.net 풀이 다이나믹 프로그래밍을 사용해서 풀이할 수 있습니다. X가 3으로 나누어 떨어진다면, [X / 3] + 1 X가 2로 나누어 떨어진다면, [X / 2] + 1 [X - 1] + 1 중에 가장 작은 값으로 갱신해주면 최솟값을 구할 수 있습니다. 그렇다면 만드는 방법에 포함되어있는 수는 어떻게 구할 수 있을까요? 저는 이전 정보를 기록할 Int 배열을 선언해주고, prevNumber[i] = j : j를 사용해 i를 만듬 으로 정의해주었습니다. 최솟값을 갱신할 때, 갱신된다면 prevNumber도..
[BOJ] 백준 1450 냅색문제 (Swift) 문제 https://www.acmicpc.net/problem/1450 1450번: 냅색문제 첫째 줄에 N과 C가 주어진다. N은 30보다 작거나 같은 자연수, C는 109보다 작거나 같은 음이 아닌 정수이다. 둘째 줄에 물건의 무게가 주어진다. 무게도 109보다 작거나 같은 자연수이다. www.acmicpc.net 풀이 이 문제는 dfs + 이분탐색으로 풀이할 수 있습니다. n이 최대 30이므로, 모든 경우의 수를 고려하면 $2^30$ = 약 10억의 비용이 드므로 시간초과가 나올 것입니다. 어떻게 시간복잡도를 줄일 수 있을까요? n을 반씩 나누어서 시간복잡도를 줄일 수 있습니다. 예를 들어 [1, 2, 3, 4] 라는 무게가 주어졌다면, [1, 2]와 [3, 4]를 나누어서 가방에 넣을지 말지를 정해..
[BOJ] 백준 1644 소수의 연속합 (Swift) 문제 https://www.acmicpc.net/problem/1644 1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 풀이 투 포인터 알고리즘으로 풀 수 있는 문제입니다. 1806 부분합 문제와 거의 동일하고, 소수만 구해주면 되는 문제입니다. 먼저 n보다 작거나 같은 소수들을 모두 구해주어야 합니다. 저는 에라토스테네스의 체 알고리즘을 사용하여 구했습니다. 그 이후 이 소수들에 대해서 투 포인터를 사용하여 부분합을 구해줍시다. 왼쪽에 포인터를 2개 두고, 소수들에 대해서 n보다 크거나 같아질 때 까지, 왼쪽의 포인터를 왼쪽으로 하나씩 옮기면서 더해줍시다. n이랑 같아졌다면, count를 1 증가시켜줍시다. n보다 커졌다면, ..
[BOJ] 백준 1806 부분합 (Swift) 문제 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 풀이 투 포인터 알고리즘으로 풀 수 있는 문제입니다. 양 끝에 포인터를 놓는 것이 아닌 왼쪽에 두개의 포인터를 두어서 풀이해야 합니다. 합이 s이하라면 하나의 포인터를 계속해서 늘려주고, s이상이 된다면 또 다른 하나의 포인터를 늘려주어서 길이를 구할 수 있습니다. 소스코드 후기 양 끝에 포인터를 두는 방식으로 투 포인터 알고리즘을 써왔었는데, 한쪽에서 출발하는 방법도 있다는 ..

반응형