본문 바로가기

자료구조&알고리즘63

[백준] 동적 프로그래밍 - 2294번 동전 2 (Java) 문제링크 2294번: 동전 2 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주 www.acmicpc.net 접근한 방법 동적 프로그래밍 문제 풀이 방법 $a_{i}$ : 금액 i를 만들 수 있는 최소한의 화폐 개수 $a_{i-k}$ : 화폐의 단위를 k라고 했을 때, 금액 (i-k)를 만들 수 있는 최소한의 화폐 개수 (i-k : 금액 i에서 화폐의 단위 k를 뺀 금액) 이 문제를 점화식으로 표현해보면 아래와 같다. $a_{i-k}$를 만드는 방법이 존재 O $a_{i} = min(a_{i}, a_{i-k}+1)$ 화폐 단위 작.. 2020. 11. 21.
[백준] 동적 프로그래밍 - 1904번 01타일 (Java) 문제링크 1904번: 01타일 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이 www.acmicpc.net 접근한 방법 동적 프로그래밍 풀이 방법 일단, 규칙을 찾는 데 집중하여 아래 표와 같이 그려보며 규칙을 발견하였다. N-1자리 끝에는 1을 붙이고, N-2자리 끝에는 00을 붙여서 N자리 수를 만들 수 있다. $a_{n} = a_{n-1} + a_{n-2}$ $a_{n}$ 나열 개수 $a_{1}$ 1 1 $a_{2}$ 11 00 2 $a_{3}$ 111 001 100 3 $a_{n}$ 1100 0000 1111 0011 1001 5 소스코드 작성 방법 a배열.. 2020. 11. 21.
[백준] 동적 프로그래밍 - 2193번 이친수 (Java) 문제링크 2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않 www.acmicpc.net 접근한 방법 동적 프로그래밍 풀이방법 일단, 규칙을 찾는 데 집중했고 아래와 같은 규칙을 발견하였다. N-1자리 이친수의 끝자리가 0이냐 1이냐에 따라 N자리 이친수의 개수가 정해진다. N-1자리 이친수의 끝자리가 0이면 0과 1을 더 붙일 수 있다. N-1자리 이친수의 끝자리가 1이면 0만 붙일 수 있다. 따라서, 점화식을 세워보면 아래와 같다. $a_{n,0}$ : n자리 이친수 중 끝자리가 0인 개수 $a_{n,1}$ : n자리 이친수 .. 2020. 11. 20.
[백준] 동적 프로그래밍 - 9465번 스티커 (Java) 문제링크 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 접근한 방법 동적 프로그래밍 풀이 방법 2행이므로 열마다의 경우의 수를 고려해보면 된다. 열 하나에서 생각해볼 수 있는 경우의 수는 아래와 같이 3가지이다. 왼쪽부터 탐색 0 1 2 X O X X X O X : 스티커를 뜯지 않음 | O : 스티커를 뜯음 이를 토대로 a[경우의 수 인덱스(크기 3)][스티커 열의 인덱스(크기 n)] 배열로 점화식을 세운다. 편의상 $a_{i,col}$라 하자. $a_{i,col}$ : col열의 i경우에 따라.. 2020. 11. 12.
[이.코.테] Chapter 08 동적 프로그래밍 - 효율적인 화폐 구성 (java) 효율적인 화폐 구성 문제 (교재 99p) 난이도 ●●○ | 풀이 시간 30분 | 시간 제한 1초 | 메모리 제한 128MB N가지 종류의 화폐가 있다. 이 화폐들의 개수를 최소한으로 이용해서 그 가치의 합이 M원이 되도록 하려고 한다. 이때 각 화페는 몇개라도 사용할 수 있으며, 사용한 화폐의 구성은 같지만 순서만 다른 것은 같은 경우로 구분한다. 입출력 조건) 입력 조건 - 첫째 줄에 N, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ K ≤ 10,000) - 이후 N개의 줄에는 각 화폐의 가치가 주어진다. 화폐 가치는 10,000보다 작거나 같은 자연수이다. 출력 조건 - 첫째 줄에 M원을 만들기 위한 최소한의 화폐 개수를 출력한다. - 불가능할 때는 -1을 출력한다. 입출력 예시) 입력 예시 출력.. 2020. 11. 10.
[이.코.테] Chapter 08 동적 프로그래밍 - 바닥공사 (java) 바닥공사 문제 (교재 223p) 난이도 ●◐○ | 풀이 시간 20분 | 시간 제한 1초 | 메모리 제한 128MB 문제가로의 길이가 N, 세로의 길이가 2인 직사각형 형태의 얇은 바닥이 있다. 태일이는 이 얇은 바닥을 1 X 2의 덮개, 2 X 1의 덮개, 2 X 2의 덮개를 이용해 채우고자 한다. 이 때 바닥을 채우는 모든 경우의 수를 구하는 프로그램을 작성하시오. 입출력 조건) 입력 조건 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1,000) 출력 조건 첫째 줄에 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최솟값을 출력한다.첫째 줄에 2 X N 크기의 바닥을 채우는 방법의 수를 796,796으로 나눈 나머지를 출력한다. 입출력 예시) 입력 예시 출력 예시 3 5 문제 풀이 방법 - .. 2020. 11. 6.
[이.코.테] Chapter 08 동적 프로그래밍 - 개미 전사 (java) 개미 전사 문제 (교재 220p) 난이도 ●●○ | 풀이 시간 30분 | 시간 제한 1초 | 메모리 제한 128MB 개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을의 식량창고는 일직선으로 이어져있다. 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다. 개미 전사는 최대한 많은 식량을 얻기를 원한다. 개미 전사를 위해 식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램을 작성하시오. 입출력 조건) 입력 조건 - 첫째 줄에 식량창고의 개수 N이 주어진다. (3 ≤ N ≤ 100) - 둘째 줄에 공백으로 구분되어 각 식량창고에 저장된 식량의 개수 K가 주어진다.. 2020. 11. 6.
[이.코.테] Chapter 08 동적 프로그래밍 - 1로 만들기 (java) 1로 만들기 (교재 217p) 난이도 ●◐○ | 풀이 시간 20분 | 시간 제한 1초 | 메모리 제한 128MB 문제정수 X가 주어질 때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다. X가 5로 나누어떨어지면, 5로 나눈다. X가 3으로 나누어떨이지면, 3으로 나눈다. X가 2로 나누어떨어지면, 2로 나눈다. X에서 1을 뺀다. 정수 X가 주어졌을 때, 연산 4개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입출력 조건) 입력 조건 첫째 줄에 정수 X가 주어진다. (1 ≤ X ≤ 30,000) 출력 조건 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 입출력 예시) 입력 예시 출력 예시 26 3 문제 풀이 방법 이 문제를 점화식으로 표현해보면 아래와 .. 2020. 11. 6.
[이.코.테] Chapter 08 다이나믹 프로그래밍 다이나믹 프로그래밍이란?: 큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 알고리즘 기법 다이나믹 프로그래밍을 사용할 수 있는 조건1. 큰 문제를 작은 문제로 나눌 수 있다. 2. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다. 탑다운(Top-Down) 방식- 재귀 함수를 이용하여 다이나믹 프로그래밍 소스코드를 작성하는 방법을, 큰 문제를 해결하기 위해 작은 문제를 호출한다 하여 탑다운 방식이라 말한다. - '하향식'이라고도 한다. - 메모제이션은 탑다운 방식에 국한되어 사용 보텀업(Bottom-Up) 방식- 단순히 반복문을 이용하여 소스코드를 작성하는 경우 작은 문제부터 차근차근 답을 도출한다고 하여 보텀업 방식이라고 말한다. - '상향식'이라고도 .. 2020. 11. 5.
시간 복잡도와 공간 복잡도 출처 : 이것이 코딩 테스트다 도서 Chapter 01 시간 복잡도 : 알고리즘을 위해 필요한 연산의 횟수 공간 복잡도 : 알고리즘을 위해 필요한 메모리의 양 시간 복잡도 빅오 표기법을 사용 * 빅오 표기법 : 가장 빠르게 증가하는 항만을 고려하는 표기법 빅오 표기법 명칭 O($1$) 상수 시간(Constant time) O($logN$) 로그 시간(Log time) O($N$) 선형 시간 O($NlongN$) 로그 선형 시간 O($N^2$) 이차 시간 O($N^3$) 삼차 시간 O($2^n$) 지수 시간 N이 1,000일 때의 연산 횟수 O($N$) 1,000 O($NlongN$) 10,000 O($N^2$) 1,000,000 O($N^3$) 1,000,000,000 시간 제한이 1초인 문제에 대한 예.. 2020. 10. 31.
[프로그래머스] 탐욕법 - 체육복 (Java) 문제 링크 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번 programmers.co.kr 접근한 방법 탐색적 알고리즘 - 탐욕적 선택 속성을 사용 : 답의 모든 부분을 고려하지 않고 탐욕적으로만 선택하더라도 최적해를 구할 수 있다 4가지 경우를 생각하여 증명해보자. - 가정 1) 왼쪽에서 오른쪽으로 순회를 한다. 2) i번째에는 체육복이 없다. - 체육복의 여유가 있는 4가지 경우의 수 i-1번째 i+1번째 1 O O 2 O X 3 X O 4 X X 경우 1 순회 방향이 왼쪽부터이므로, i-1번째 이전까지는 순회가 완료된 것이다. 만약, i.. 2020. 10. 30.
탐욕법 탐욕법(Greedy Method) 재귀 호출과 똑같이 여러 개의 조각으로 쪼개고, 각 단계마다 답의 한 부분을 만들어감 ≒ 동적 계획법, 완전 탐색but, 동적 계획법과 완전 탐색은 모든 선택지를 고려해보고 그 중 전체 답이 가장 좋은 것을 찾음 각 단계마다 지금 당장 가장 좋은 방법만을 선택 탐욕적 알고리즘이 사용되는 경우 탐욕법을 사용해도 항상 최적해를 구할 수 있는 문제를 만난 경우, 탐욕법은 동적 계획법보다 수행 시간이 훨씬 빠르기 때문에 유용 시간/공간적 제약때문에 다른 방법으로 최적해를 찾기 너무 어렵다면, 적당히 괜찮은 답(근사해)을 찾는 것으로 타협할 수 있음 탐욕법은 이럴 때 최적은 아니지만 임의의 답보다는 좋은 답을 구하는 용도로 유용 정당성의 증명 : 탐욕적인 알고리즘이 항상 최적해를.. 2020. 10. 30.
반응형