본문 바로가기

알고리즘/백준

(40)
[백준 14002: JAVA] 가장 긴 증가하는 부분 수열 4/ 동적 프로그래밍 + 역추적 개요 이 문제는 dp와 이분 탐색으로 풀이할 수 있다. 하지만 문제의 입력의 최댓값이 1000이기 때문에 나는 dp로 풀이할 것이다. dp로 풀이할 때는 이전에 구한 값을 통해 풀이하게 된다. 또한 시간은 O(n^2)이 될 것이다. 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 풀이 dp[i] = k → i번째 수열까지의 최대 증가수열의 길이 = k 라고 생각하고 접근하면 된다. 예를 들어 수열 {1, 2, 1, 3, 4, 3}이 주어지고 인덱스가 1부터 시작하여 6까지 ..
[백준 12852: JAVA] 1로 만들기 2 / 동적 프로그래밍 + 역추적 개요 dp를 이용해서 구하며, dp[i] = k → i까지 가는데 걸리는 최소 비용 = k로 배열을 선언하고 풀이하였다. 따라서 점화식은 dp[i] = min(dp[i * 3], dp[i * 2], dp[i + 1]) + 1 이 된다. 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 풀이 1. dp[n] ~ dp[1]까지를 구한다. 2. dp값을 기준으로 (* 2, * 3, +1 이 가능한지) 와 (dp값의 차이가 1인지) 를 확인하며 후보들을 스택..
[백준 2482: JAVA] 색상환 / 동적 프로그래밍 개요 dp로 문제를 풀 수 있다. 이 문제는 dp를 생각하면 금방 풀이할 수 있지만, 약간의 조건이 추가되어 있기 때문에 생각을 좀 해야 했다. 한 칸씩 떨어져 있어야 하고 첫 색과 마지막 색도 떨어져야 하기 때문에 조금 까다로워 보일 수 있다. dp는 일반적으로 이전의 값들을 이용하여 현재 원하는 값을 도출해내는 방식이기 때문에 어떻게 값을 도출해낼지 점화식을 만들어 보면 다음과 같다. 1~n번째까지 색이 있다면, n번째 색을 선택한 경우 + n번째 색을 선택하지 않은 경우로 구할 수 있다. 이걸 생각하고 문제를 풀어보자. 문제 색을 표현하는 기본 요소를 이용하여 표시할 수 있는 모든 색 중에서 대표적인 색을 고리 모양으로 연결하여 나타낸 것을 색상환이라고 한다. 미국의 화가 먼셀(Munsell)이 교..
[백준 17404: JAVA] RGB거리 2 / 동적 프로그래밍 개요 dp로 문제를 풀 수 있다. 이 문제는 dp를 생각하면 금방 풀이할 수 있지만, 약간의 조건이 추가되어 있기 때문에 생각을 좀 해야 했다. 첫 집과 마지막 집도 색이 같으면 안 된다는 조건이 있기 때문에 첫 집의 색을 고정 시키고 두 번째 집부터 마지막 집까지 3가지 색을 조합하며 최솟값을 구하여 dp배열을 채워준다. 그 후 마지막에 최솟값을 구할 때 고정시킨 첫 집의 색과 다른 마지막 집의 값들에서 최솟값을 추출해내면 된다. 문제 RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑 중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집도 이웃이다. 각 집을 빨강으로 칠할 때 드는 비용, 초..
[백준 10815: JAVA] 숫자 카드 / 이분 탐색 개요 기본적인 이분 탐색을 이용하면 풀이할 수 있다. 일반적으로 이분탐색을 모르면 for문을 끝까지 돌려서 찾으려 할 것이다. 그러나 그렇게 하면 이 문제의 경우 최대 (500,000 * 20,000,000) 번 탐색을 하게 된다. 시간 초과가 발생하기 때문에 이분 탐색을 이용하면 더 빠르게 찾을 수 있다. 문제 숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오. 입력 풀이 이분탐색을 위해 정렬을 진행하고 나면 arr배열에는 아래와 같이 데이터가 정렬이 된다. 문제에서 찾고자 하는 숫자를 num이라고 한다면, 1. 초기 값으로 left = 0, ri..
[백준 2098: JAVA] 외판원 순회 / dp + 비트 마스크 개요 이 문제는 외판원 순회 문제로 TSP(Traveling Salesman Problem) 으로 불린다. 비트 마스크를 dp를 사용할 때 어떻게 활용할 수 있는지 알 수 있는 문제이다. 만약 비트 마스크가 뭔지 모른다면 아래의 문제와 풀이를 먼저 보고 오는 것을 추천한다. https://www.acmicpc.net/problem/11723 11723번: 집합 첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다. www.acmicpc.net 2020/02/12 - [알고리즘/백준] - [백준 11723 : JAVA] 집합 / 비트마스크 [백준 11723 : JAVA] 집합 / 비트마스크 개요 이 문..
[백준 11723 : JAVA] 집합 / 비트마스크 개요 이 문제는 비트 마스크의 기본적인 개념을 활용하면 풀이할 수 있는 문제이다. 처음에는 boolean[]을 선언해서 풀었다. boolean [20]을 선언하여 b [0] ▶ true이면 1이 있는 것, false이면 1이 없는 것으로 풀이했다. 그러나 문제 이름처럼 bitmask를 이용하면 더욱 메모리를 효율적으로 사용할 수 있다. int 자료형 a를 선언하면 4바이트(4 * 8bit)를 메모리에 할당받아 총 32개에 대에 참, 거짓을 판단할 수 있게 된다. a = 00000000 00000000 00000000 00000000(2)로 메모리에 할당받는다. 따라서, 총 0~31까지 수의 집합을 나타낼 수 있다. 2^0자리 ▶ 0의 true, false 2^1자리 ▶ 1의 true, false 2^2자..
[백준 1956 : JAVA] 운동 / 벨만-포드 개요 알고리즘 문제를 풀 때는 문제를 잘 읽고 어떤 알고리즘을 적용할 수 있을까?를 먼저 생각하는 편이 좋다. 이 문제는 1 ▶ 1, 2 ▶ 2, 3 ▶3 ..... n ▶n 으로 가는 최단거리 중 최솟값을 구하는 문제이다. 시작 노드가 모든 노드에 해당하는 값을 알아야 하기 때문에 다익스트라, 벨만 포드가 아닌 플로이드 와샬을 사용한다. 플로이드 와샬을 통해 모든 노드 ▶ 모든 노드 의 최단거리를 구한 뒤 사이클을 이루는 도로의 길이 중 최솟값을 구한다. 플로이드 와샬이 처음이라면 아래의 문제와 풀이를 먼저 풀고 이 문제를 푸는 것을 추천한다. 아래의 풀이에는 간략한 플로이드 와샬 알고리즘에 대한 설명이 있다. https://www.acmicpc.net/problem/11404 11404번: 플로이드 ..