코드 저장소

공부에는 끝이 없다!

JAVA/코딩 테스트 32

(JAVA)백준 문제 풀이 - 동적계획법 단계 - 11053번 가장 긴 증가하는 부분 수열 (실버 2)

이번 문제는 특정 수열 A가 주어 졌을때, 가장 긴 증가하는 부분의 수열길이를 구하는 문제이다. 나는 Top-Down 방식으로 구현하였는데 어떤 부분에서 잘못 생각을 했고 어떻게 풀어 냈는지 살펴보자. 문제를 살펴보자! 문제 자체는 사실 비교적 간단해 보인다. 가장 작은 값과 가장 큰 값을 찾은 후 둘 사이의 값이 몇개인지만 찾아내면 되기 때문이다. 간단하게 표를 만들어 살펴보자. 0 1 2 3 4 5 10 20 10 30 20 50 1 2 1 3 2 4 각 값을 들어온 순서대로 배열에 담는다면 위와 같이 담기게 될 것이다. 그렇다면 10~50 사이에는 10, 20, 30, 50이라는 4개의 값이 들어오기 때문에 최종적으로 가장 긴 배열의 길이는 4이다. 중간에 같은 값이 껴있더라도 어차피 최소 숫자 ~..

(JAVA)백준 문제 풀이 - 동적계획법 단계 - 12865번 평범한 배낭 (골드 5)

이번 문제는 동적 프로그래밍을 이용하여 배낭에 넣을 수 있는 최대 가치 값을 찾아내는 문제이다. 골드 난이도 답게 난도가 좀 있었는데 혼자서 이리저리 짜보다가 생각처럼 잘 되지 않아 ChatGpt의 도움을 약간 받아 해결하였다. 그러면 어떻게 문제를 풀었고 어디가 문제였는지 살펴보자. 무엇이 반복되는가? 이전 글에서도 서술 했지만 동적 계획법의 핵심은 반복되는 요소를 기록하여 시간을 단축시키는 것이다. 그러면 무엇이 반복되는 것이고 그것을 어떤 방법으로 기록할 것인지가 핵심이 되겠다. 문제는 배낭의 넣을 수 있는 물건들의 최대 가치값만을 요구하고 있기 때문에 안에 몇개가 들어가는지, 몇종류가 들어가는지는 중요하지 않다. 즉, 배낭에 무게별로 들어가는 가치합이 반복되는 요소가 될 것이다. 그럼 남은 문제는..

(JAVA) 백준 문제 풀이 - 동적계획법 단계 - 24416번 알고리즘 수업 - 피보나치 수열 (브론즈 1)

이번 문제는 동적 프로그래밍을 이용하여 피보나치 수열을 풀어보는 문제이다. 기존에 재귀를 이용하여 피보나치 수열을 계산하는 것을 해보았지만, 이번에는 동적 프로그래밍을 이용하여 더 빠르고 효율적인 프로그래밍을 하는것이 목적이다. 그럼 우선 동적 계획법에 대해서 자세하게 살펴보자. 동적 계획법(Dynamic Programming) 이란... 동적 계획법(줄여서 DP라고 부르기도 한다.) 을 간단하게 설명하면 답을 재활용하는 것이다. 좀 더 본질적인 의미를 살리자면 기억하며 풀기라고 생각해도 되겠다. 어떤 문제를 풀기 위해 그 문제를 더 작은 문제의 연장선으로 생각하고, 과거의 구한 해를 활용하는 것이 동적 계획법의 핵심이다. 문제를 작은 문제로 쪼개어 생각한다는 점에서 분할 정복 알고리즘과 비슷하게 보이기..

(JAVA) 백준 문제 풀이 - 조합론 단계 - 1010번 다리 놓기 (실버 5)

이번 문제는 주어진 테스트 케이스의 각각의 경우의 수를 출력하는 문제이다. 위 문제를 풀기 위해서는 이항 계수를 이해할 필요가 있는데 수학을 조금 아는 사람이라면 로직 자체는 어렵지 않기 때문에 금방 풀 수 있을 것이다. 하지만 나는 수학에 손을 놓은지 꽤 된 터라... 문제를 이해하는데 꽤나 애를 먹었다. 그러면 이항계수가 무엇이고 이를 이용하여 어떻게 문제를 풀어야 하는지 알아보자. 이항 계수(Binomial Coefficient)란? en.wikipedia.org/wiki/Binomial_coefficient Binomial coefficient - Wikipedia en.wikipedia.org 이항 계수에 대한 정확한 개념은 위 글에 잘 정리가 되어있다. 이항계수란 주어진 크기의 집합에서 원하는..

(JAVA)백준 문제 풀이 - 스택, 큐, 덱 단계 - 24511번 queuestack (실버 3)

이번 문제는 덱을 이용하여 스택과 큐가 혼합된 자료구조에 배열이 입력되었을때 출력 값을 구하는 문제이다. 문제를 이해하는데 꽤 애를 먹었는데 각각의 자료구조에 한 개의 원소가 들어있다라는 문구를 제대로 이해하지 못해서 처음에는 입력받은 자료구조의 배열을 통과하면서 스택과 큐로 변형되는 문제인줄 알았다가 예시를 한참 보고서야 제대로 이해할 수 있었다. 문제부터 이해하자! 예시를 잘 살펴보면서 문제를 이해해보자. 첫번째 예시에서 자료구조는 [큐,스택,스택,큐]의 구조로 이루어진다. 그리고 통과할 배열은 [1,2,3,4]로 이루어져있다. 나는 처음에 초기 상태를 보고 첫번째에는 2라는 입력값이 큐로 한번 통과하여 [2,3,4,2]로 나오고 그다음 출력된 1을 스택으로 통과시켜 [2,3,4,2]로 나오게 하여 ..

백준 문제 풀이 - 집합과 맵 단계 - 1269번 대칭 차집합 (실버 4)

이번 문제는 배열이 주어졌을 때, 두 배열의 차집합의 원소 갯수를 구하는 문제이다. 나는 처음에는 HashMap을 이용했는데 가만히 생각해보니 HashSet을 이용해야 했다는 것을 알았다. 우선 구현한 코드를 먼저 보고, 무엇이 잘못 되었고 왜 HashSet을 사용해야 하는지 살펴보자. import java.io.*; import java.util.*; class Main{ public static int n,m; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] str = br.readLine().sp..

백준 문제 풀이 - 정렬 단계 - 11650번 좌표 정렬하기 (실버 5)

이번 문제는 1차원 배열이 아닌 2차원의 배열을 오름차순으로 정렬하는 문제이다. 2차원 배열을 정렬하기 위해선 기존 sort()메서드를 바로 사용할 순 없고 약간 다르게 사용해야 했는데 그럼 2차원 배열을 정렬 하는 방법을 알아보자. Comparator 익명 클래스 구현 2차원 배열에서 Arrays.sort() 메서드를 사용하게 되면, java.lang.ClassCastException: I cannot be cast to java.lang.Comparable이란 오류가 발생하게 된다. 비교 기준이 정의 되어있지 않기 때문인데, 때문에 Comparator 인터페이스를 구현하여 정렬기준을 추가해 줘야한다. comparable, comparator 구현에 대해서 잘 정리된 글이 있어 참고하였다. https:..

백준 문제 풀이 - 정렬 단계 - 10989번 수 정렬하기 3 (브론즈1)

N개의 수가 주어졌을 때, 오름차순으로 정렬하는 간단한 프로그램 구현 문제이다. 중요한 것은 제한사항인데, 입력에는 중복된 값이 있을 수 있고, 최대 값은 10000이다. 나는 이전 수 정렬 문제들을 sort() 메서드를 이용하여 풀었는데 (이미 해당 메서드를 알고 있었다.) 이번 문제에서 카운팅 정렬과 sort()메서드의 속도를 비교해 보기로 하였다. 우선, 2751번 - 수 정렬하기 2 (실버 5) 에서 사용하였던 오름차순 정렬 코드를 살펴 보자. 2751번 - 수 정렬하기 2 (실버 5) https://www.acmicpc.net/problem/2751 위 문제 역시 오름차순으로 입력받은 값을 정렬하기만 하면 되는데, 두 문제의 차이는, 최대 값과 중복값의 여부이다. 다만, 위의 문제는 효율성을 검..

백준 문제 풀이 - 브루트 포스 단계 - 2213번 분해합 (브론즈 2)

이번 단계는 브루트 포스 단계이다. 먼저 브루트 포스란 말 자체를 처음 듣는지라 브루트 포스 알고리즘이 뭔지는 알아보고 문제를 시작하기로 하였다. 브루트 포스(Brute Force) - 완전 탐색 브르투 포스란 직역하면 짐승같은 힘, 무식한 힘이라는 뜻이다. 설명 그대로 무식하게 처음부터 끝까지 모든 경우를 다 탐색하는 알고리즘으로 완전 탐색의 종류 중 하나이다. 즉, 모든 경우를 고려한 방법으로 확실한 정답을 찾을 수 있는 장점이 있지만, 그만큼 모든 경우의 수를 다 고려하기 때문에 실행시간이 오래 걸리는 편이다. 방법은 조건문을 이용하여 모든 경우의 수를 찾는 것으로 모든 경우의 수를 반복하며 조건을 이용하여 정답을 찾아낸다. 자 그렇다면 문제로 다시 돌아와 보자, 우리는 어떤 수 N이 들어왔을때 자..

백준 문제 풀이 - 약수, 배수와 소수 단계 - 11653번 소인수분해 (브론즈 1)

정수 N이 주어졌을 때, 소인수 분해하는 프로그램을 작성하는 간단한 문제이다. 우선 소인수분해에 대해서 알아보자. 소인수분해는 어떤 자연수를 소수의 곱으로 분해하는 과정을 말한다. 간단히 말하자면, 주어진 수를 더 이상 분해할 수 없을 때까지 소수로 나누어주는 과정이다. 따라서 이번 문제는, 얼마나 빠르게 소수를 찾아 가장 작은수 부터 출력해 주느냐가 관건이 되겠다. 나는 이전 문제부터 사용하던 소수 판별 로직을 가져와, 가장 작은 소수부터 잘라 나가는 코드를 만들었다. import java.io.*; class Main{ public static int n,num; public static boolean isPrime; public static void main(String[] args) throws ..