본문 바로가기

반응형

분류 전체보기

(395)
[디자인 패턴] 팩토리 패턴에 대해 알아보기 (Swift) 1. 팩토리 패턴이란? 객체 생성 부분을 따로 두어 추상화하고, 인스턴스를 생성할 클래스를 서브클래스에서 결정하는 패턴입니다. 맨처음 말로만 들었을 때, 잘 이해가 가지 않았습니다. 예를들어, 내가 햄버거 가게를 오픈을 했는데 처음에는 불고기버거만 만들줄 알았다고 가정해봅시다. 그렇다면 불고기 버거 인스턴스를 만들 class를 선언을 해야합니다. 이제 버거 기술이 발전해서 새우버거랑 치킨버거도 만들 수 있게 되었습니다. 그렇다면 새우버거, 치킨버거 class도 선언을 해주어서 인스턴스를 생성해주어야겠네요. 이러한 버거들을 (인스턴스) 불고기버거, 새우버거, 치킨버거를 생성하는 것을 서브클래스에서 결정을 해주는게 팩토리 패턴입니다. 이 인스턴스를 생성하는 것을 팩토리 클래스에서 생성하여 반환하게 됩니다. ..
[디자인 패턴] 싱글톤 패턴에 대해 알아보기 (Swift) 1. 싱글톤 패턴이란? 하나의 클래스에 오직 하나의 인스턴스를 갖는 디자인 패턴입니다. Dog라는 클래스를 하나 만들고, 인스턴스를 생성해주었습니다. dog1과 같은 인스턴스를 참조하기 위해 dog2라는 변수를 두었고, 참조가 같은지 확인하였습니다. dog2의 name도 변경해보고 dog1의 name이 변경되었는지 확인을 해보았습니다. 같은 인스턴스에 접근을 하고있다는 것을 확인할 수 있습니다. Dog 클래스를 통해 인스턴스를 하나 더 생성을 하고 dog3라는 변수로 두었습니다. 당연하게도 dog3는 dog1과 dog2와는 다른 인스턴스 일 것입니다. 싱글톤 패턴을 사용하면 하나의 클래스에 오직 하나의 인스턴스를 갖기 때문에 Dog 클래스로 생성한 인스턴스는 다 같은 인스턴스가 될 것입니다. Swift에..
[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보다 커졌다면, ..

반응형