Algorithm 79

[algospot] Quantization (c++)

출처 : algospot.com :: QUANTIZE algospot.com :: QUANTIZE Quantization 문제 정보 문제 Quantization (양자화) 과정은, 더 넓은 범위를 갖는 값들을 작은 범위를 갖는 값들로 근사해 표현함으로써 자료를 손실 압축하는 과정을 말한다. 예를 들어 16비트 JPG 파일 www.algospot.com 풀이 방법 정렬이 중요한 문제이다. 문제가 안 풀릴 시 정렬을 한번 생각해 보자 재귀 호출시 인자로 시작점과 남은 구간 자르기 횟수를 넘겨주면 된다 오차 제곱의 합을 구할 때 구간에서 평균값을 채택하면 구할 수 있다. 오차 제곱의 합의 값 계산은 구간 합 - 2 * 평균 * 구간 합 + 평균 * 평균 *(hi -lo +1)을 해주면 된다 여기서 hi 와 l..

Algorithm 2021.04.02

[백준] 설탕 2839번 (c++)

출처 : 2839번: 설탕 배달 (acmicpc.net) 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 풀이 방법 dp 문제로 쉬운 문제였다. 재귀로 n을 입력받아 min(f(n-5), f(n-3)) + 1을 해주면 된다 기저 조건으론 n이 음수이면 INF(매우 큰 값)를 리턴해서 선택되지 못하게 n이 0이면 0을 리턴해서 끝났다는 것을 알려 주었다 마지막 출력부분에선 f(n)이 INF보다 크면 -1을 리턴 아니면 f(n)의 리턴 값을 리턴해 주면 된다 #include #include #include #include ..

Algorithm 2021.04.02

[algospot] 폴리오미노 (c++)

풀이 방법 dp 문제인데 문제를 부분 문제로 나누기 어려운 문제 였다. 처음에는 정사각형 하나를 두고 상하좌우로 사각형을 붙이는 형태로 부분 문제를 쪼개려고 생각 했지만 이러면 중복되는 부분을 다 제거 하기가 복잡해서 실패 했다. 정답은 층별로 부분 문제를 쪼개는 것이다 재귀 함수로 현재 남은 상자수와 각 재귀마다 첫 층에 쓸 상자수를 보내주고 함수 안에서 for 문을 돌며 2번째 층에는 몇개의 상자를 사용할지 선택후 함수 리턴값을 더하면 된다 여기서 리턴값에 first + second - 1를 곱해주어야 한다 1층과 2층을 한 칸씩 옆으로 이동시키면 다른 경우가 되기 때문이다. 시간 복잡도는 O(n^3)이다. #include #include #include #include const int MOD = ..

Algorithm 2021.04.01

[백준] 가장 큰 정사각형 1915번 (c++)

출처 : 1915번: 가장 큰 정사각형 (acmicpc.net) 1915번: 가장 큰 정사각형 첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다. www.acmicpc.net 풀이 방법 dp 문제이다 문제를 쪼개는 방법이 중요하다. 쪼갤 때 사각형의 가장 왼쪽 위 배열을 기준으로 그 정사각형의 한 변의 길이를 기록한다. 가장 큰 정사각형의 변의 길이를 제곱하여 넓이를 구한다. 0000 1111 1111 0000 예를 들어 위 경우에서 왼쪽 위 모서리의 배열에 길이를 저장이면 dp[1][0] = 2, dp[1][1] = 2.. 이렇게 되지만 dp[2][0] 은 1이 된다 변의 길이가 2인 정사각형에 포함은 되지만 그 정사각형에서 왼쪽 위의 점..

Algorithm 2021.03.31

[학교 과제] 프리랜서 (c++)

문제 고급 주택을 청소해주는 프리랜서가 있다. 최대한의 이익을 얻기 위해서 청소 스캐쥴을 짜야한다. 입력으로는 N이 주어지는데 N개의 청소할 수 있는 곳이 나온다 다음 N개의 줄에는 시작일, 마감일, 비용이 나오고 같은 비용일 때는 적은 일을 한 스캐줄이 선택 받는다. 주택을 옮기는데 비용이 들기 때문에 10만원이라는 지출이 발생한다. 일이 1일에서 3일까지 라면 3일 까지 일을 하는 것이기 때문에 3일에 일을 시작 할 순 없다. 해결 방법 dp 문제로 처음에는 일을 시작하는 날을 기준으로 cache의 인덱스를 정했지만 이러면 같은 날 시작하는 일이 2개 있을 경우 먼저 나온 일로 cache에 저장 되기 때문에 해결 할 수 없다. 그래서 일이 입력된 인덱스를 cache의 인덱스로 잡아 해결 하였다. 재귀..

Algorithm 2021.03.30

[학교 과제] 카드덱 (c++)

문제 1부터 N까지 정수가 쓰인 N장의 카드 중 1~2장의 카드가 빠졌다 빠진 카드를 찾아라 (단 공간 복잡도는 O(1)의 공간 복잡도를 가져야 한다.) 빠지지 않은 카드의 번호는 무작위로 섞여 하나씩 제공된다. 풀이 방법 만약 카드가 1장 빠졌다면 1부터 N까지의 합(n*(n+1)/2) 에서 제공되는 카드수를 더 한 값을 빼면 빠진 카드의 수를 알 수 있다. 2장인 경우에는 식이 하나 더 필요하다 1부터 N까지의 제곱의 합이 필요하다 (n*(n+1)*(2n+1)/6) 에서 제공되는 카드의 수를 제곱한 것을 빼면 빠진 두 카드의 제곱의 합을 구 할수있다. 여기서 두 수를 더한 수의 제곱에서 두 카드의 제곱의 합을 빼면 수두의 2*곱한 값 을 알 수 있다. 두 수를 더한 값을 A 두수를 곱한 값을 B라고 ..

Algorithm 2021.03.30

[백준] 퇴사 14501번 (C++)

출처 : 14501번: 퇴사 (acmicpc.net) 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 풀이 방법 일을 할지 안 할지 선택하면 되는 dp 문제이다 문제의 입력을 받은데로 인덱스가 시작일 이므로 문제는 간단하다 다음 날 일을 시작하면 p[day]+Money(day + t[day]) 그냥 넘기려면 Money(day+1)을 해주어서 둘 중 max를 선택하면 된다. #include #include #include using namespace std; const int MAX = 15 + 1; const int INF = 987654321; int N; int cache[MAX]; int t[MAX]; int p[MAX]; int Money(..

Algorithm 2021.03.24

[백준] 회문 17609번 (c++)

출처 : 17609번: 회문 (acmicpc.net) 17609번: 회문 각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다. www.acmicpc.net 풀이 방법 회문을 판별하는 알고리즘은 쉽게 생각해 낼 수 있다. 하지만 유사회문을 판별을 하는데 조금 생각을 해야 한다. 유사회문은 한 알파벳을 제거했을 때 회문이 되면 유사회문이라고 한다 여기서 유사회문을 판별하는 방법은 문자열을 처음과 끝에서부터 비교해 오면서 다른 문자가 나올 때 앞쪽 문자를 버릴지 뒤쪽 문자열을 버릴지 판별해주면 된다. 앞쪽 문자를 버리는 경우는 앞쪽 인덱스를 한 칸뒤로 보낸 뒤 뒤쪽문자와 같으면 isPalin함수를 ..

Algorithm 2021.02.28

[프로그래머스] 문자열 내 마음대로 정렬하기

출처 : 코딩테스트 연습 - 문자열 내 마음대로 정렬하기 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 문자열 내 마음대로 정렬하기 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1 programmers.co.kr 풀이 방법 lambda 함수를 사용하여 정렬을 하면 간단하게 풀이할 수 있다. 같은 문자가 2개 이상이면 같은 문자를 가지는 단어끼리는 사전 순으로 앞선 문자열이 앞쪽에 위치하도록 해야 하는데 이런 경우를 해결하기 위해 미리 lambda 함수를 사용 전 사전 순으로 정렬을 한 후 lambda ..

Algorithm 2021.02.24