본문 바로가기

연습문제/JAVA

(66)
[백준 java] 11054 - 가장 긴 바이토닉 부분 수열 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 내가 푼 방법 가장 긴 증가하는 부분수열과 감소하는 부분수열을 합친 문제이다. 나는 기준점 (idx) 을 잡아 그 기준점보다 낮은 인덱스는 LIS 알고리즘을 그리고 높은 인덱스는 LIS를 뒤집어 사용하여 감소하는 부분 수열을 구현하였다. 10 1 5 2 1 4 3 4 5 2 1 만약 위 예제에서 idx = 3을 조사한다 하면 arr[3]을 기준으로 { 1, 5, 2 } 를 오름차순 긴 부분수열을 구하고, { 2, 1, 4, 3, 5, 2, 1 } 을 내림차순 긴 부분수열을 구한다 이..
[백준 java] 11722 - 가장 긴 감소하는 부분 수열 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net [백준 java] 11053 - 가장 긴 증가하는 부분 수열 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부 dwc04112.tistory.com 위 문제와 매우 유사한 문제이다. 이번에도 dp에 해당 숫자로 ..
[백준 java] 11053 - 가장 긴 증가하는 부분 수열 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 최장 증가 부분 수열(Longest Increasing Subsequence) 알고리즘으로 풀 수 있는 문제이다. 어떤 수열이 주어지면 그 수열 내에서 (변형x) 오름차순으로 구성된 가장 긴 수열을 LIS 라고 한다. 이 알고리즘을 사용하기 전에는최소값 index를 구하여 해당 index부터 최장거리를 구하려고 했는데중복되는 최소값이 있으면 길이를 구하지 못해서 바로 틀렸다... [BO..
[백준 java] 1890 - 점프 1890번: 점프 첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 www.acmicpc.net dp에 경로의 수를 저장하면서 도착 경로의 수를 구하는 문제이다. 원래는 해당 경로를 지났다는 표시만 하고 board[ i ] [ j ] 의 다음 목적지인 아래값이 x 축으로 이동하면 board[ i + board[ i ] [ j ] ] [ j ] y 축으로 이동하면 board[ i ] [ j + board[ i ] [ j ] ] 목적지인 board[ N-1 ] [ N-1 ] 에 도달하면 count ++ 하는 방식으로 계산했는데 이렇게 하면 이전에서 ..
[백준 java] 11048 - 이동하기 11048번: 이동하기 준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 www.acmicpc.net 입력받은 숫자들을 2차원 int배열에 넣고 해당 배열을 사용하여 dp[i][j]의 값을 구한다. dp[i][j-1] 와 dp[i-1][j] 의 값을 비교하여 dp[i][j]를 구한다. 만약 b[1][2]의 총 최대값을 구하려면 b[0][2]와 b[1][1] 을 비교하여 큰 값을 b[1][2]과 더하여 dp에 저장한다. 이것을 dp[N][M]까지 반복하여 계산하면 사탕수의 최대값을 구할 수 있다. import java.io.BufferedReader;..
[백준 java] 10884 - 쉬운 계단 수 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제풀이 첫째줄 n을 입력받는다. 여기서 n은 자릿수를 나타낸다 n=2 두자릿수 중 계단 수를 찾는다. (총 17개) 1 : 10, 12 (2개) 2 : 21, 23 (2개) 3 : 32, 34 (2개) 4 : 43, 45 (2개) 5 : 54, 56 (2개) 6 : 65, 67 (2개) 7 : 76, 78 (2개) 8 : 87, 89 (2개) 9 : 98 (1개) 만약 n이 3이라면 n=3 1 : 123, 121, 101 (4개) 2 : 210, 212, 232, 234 (4개) 두번째 자릿수의 경우의 수는 n=2에서 구한 갯수가 들어간다. 예를들어 첫번째 자릿수가 2이면 두..
[백준 java] 11057 - 오르막 수 오르막 수 만들기 1112 1234 1345 이런식으로 인접한 숫자가 같거나 점점 오르는 형태의 수여야한다. 따라서 첫번 째 수에따라 만들 수 있는 수가 달라진다. 두 자리 수를 만들때 첫번째 숫자가 1이면 1 2 3 4 5 6 7 8 9 를 붙여 9개의 숫자를 만들 수 있고 첫번째 숫자가 4이면 44 45 46 47 48 49 6개 숫자를 만들 수 있다 세 자리 숫자를 만들때 만약 첫 숫자가 0이면 뒤에 모든 숫자가 올 수 있으니 두자리 숫자의 전체 갯수 55개의 숫자가 올 수 있고 첫 숫자가 1이면 55에서 두번 째 자리 숫자가 0이 올 수 없다 따라서 0으로 만들 수 있는 두자리 수를 다 빼줘야한다. 위 연산을 계산하기 위해 2차원 배열 dp를 만들었고 dp[ i ][ j ]에서 i는 i자릿수, j..
[백준 java] 11727 - 2xn 타일링 2 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 내가 푼 방법은 n = 1부터 5까지 구하고 해당 결과로 점화식을 찾았다. n = 1 : 1개 n = 2 : 3개 n = 3 : 5개 n = 4 : 11개 따라서 dp[n] = dp[n-1] + dp[n-2]*2 이란 점화식이 나온다. 내가 푼 해결방식은 너무 별로라서 다른 풀이를 찾아봤는데 다음과 같이 n=3일때 사각형 배치 방식은 시작이 n=2 으로 시작하거나 n=1 에 2x1사각형 가로로 두 개 or 2x2사각형 하나가 붙어있는 형태 즉 n=1로 두가지 형태를 만들 수 있게 된다. 따라서..