코드 저장소

공부에는 끝이 없다!

Java 24

(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의 도움을 약간 받아 해결하였다. 그러면 어떻게 문제를 풀었고 어디가 문제였는지 살펴보자. 무엇이 반복되는가? 이전 글에서도 서술 했지만 동적 계획법의 핵심은 반복되는 요소를 기록하여 시간을 단축시키는 것이다. 그러면 무엇이 반복되는 것이고 그것을 어떤 방법으로 기록할 것인지가 핵심이 되겠다. 문제는 배낭의 넣을 수 있는 물건들의 최대 가치값만을 요구하고 있기 때문에 안에 몇개가 들어가는지, 몇종류가 들어가는지는 중요하지 않다. 즉, 배낭에 무게별로 들어가는 가치합이 반복되는 요소가 될 것이다. 그럼 남은 문제는..

백준 문제 풀이 - 집합과 맵 단계 - 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..

백준 문제 풀이 - 일반 수학 1단계 - 2745번 진법 변환 (브론즈 2)

어느덧 일반 수학 단계까지 넘어왔다. 이번 문제는, B진법의 수 N이 주어졌을 때, 이 숫자를 10진법으로 바꾸어 출력하는 프로그램을 구현하는 문제이다. 우선, 내가 수학에 좀 약한지라 진법의 변환을 어떤식으로 하는지 이해를 못해서 진법에 대해서 먼저 찾아봐야 했다. 해당 문제를 chatGPT를 이용하여 질문을 해보았더니 다음과 같은 답변을 얻을 수 있었다. 36진법을 10진법으로 변환하는 과정은 다음과 같이 진행됩니다. 각 자릿수의 값을 계산하고 해당 값을 36진법에서 10진법으로 변환하여 더해주면 됩니다. 예를 들어, ZZZZZ의 36진법 값을 10진법으로 바꿔보겠습니다: ZZZZZ(36진법) = Z * 36^4 + Z * 36^3 + Z * 36^2 + Z * 36^1 + Z * 36^0 = 35 ..

백준 문제 풀이 - 2차원 배열 단계 - 2563번 색종이 (실버 5)

해당 문제는 총 100x100의 크기의 도화지에 색종이를 붙인다고 할때, 색종이가 붙어 있는 영역의 전체 넓이를 구하는 문제이다. 색종이의 수는 처음에 입력되며 크기는 10x10으로 고정이지만, 겹치는 부분이 생길 수 있으므로, 그것을 감안하여 계산하여야 한다. 나는 전체 도화지를 100x100의 빈 2차원 배열을 만들어 두고, 2차원 배열 안에 색종이의 시작점이 주어지면 시작점에서 + 10으로 2중 for문을 돌려서 해당하는 인덱스에 집어넣은 후, 값이 있는 것만 다른 배열에 담아 해당 배열의 크기를 구하여 계산하는 방식으로 설계를 하였다. 코드는 다음과 같다. import java.io.*; import java.nio.Buffer; import java.util.*; class Main{ publi..

백준 문제 풀이 - 2차원 배열 단계 - 2738번 행렬 덧셈 (브론즈 5)

브론즈 5단계의 간단한 문제이지만, 이중 반복문의 반복이 아닌 다른 방법으로 풀어 정리를 해두고자 한다. 우선 문제를 살펴보자. 해당 문제는 2차원 행렬이 주어지는 2개의 2차원 배열의 값을 더하여 하나의 2차원 배열로 만드는 것이다. 문제의 제약조건이 그렇게 크지 않아 배열의 크기가 100*100을 넘어 가지는 않는다. 때문에 대부분의 사람들이 이중 포문의 반복으로 풀어낸 것을 볼 수 있었다. import java.io.IOException; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); int ..

백준 문제 풀이 - 심화 1 단계 - 1157번 단어 공부 (브론즈 1)

알파벳 대소문자로 된 단어가 주어졌을 때, 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하는 문제이다. 제한이 좀 있는데, 알파벳의 대 소문자를 구분하지 않으며, 가장 많이 사용된 알파벳을 대문자로 출력하여야 한다. 주어진 단어는 최대 100만의 길이를 가질 수 있다. 또한 가장 많이 사용된 알파벳이 여러 개 존재하는 경우 ? 를 출력한다. 처음 문제를 풀때에는 찾을 문자열의 갯수를 리턴하는 메서드를 만들어, 문자열의 길이만큼 반복하며 최대 값의 문자를 찾는 방법으로 구상을 하였다. 그래서 메서드를 filter를 사용한 람다식으로 구성하였는데 코드는 다음과 같다. import java.util.*; import java.io.*; class Main{ public static St..

백준 문제 풀이 - 문자열 단계 - 5622번 다이얼(브론즈 2)

문자열 단계도 이제 거의 막바지이다. 이번 문제는 다이얼 전화기에 각 알파벳에 해당하는 숫자가 있고, 문자열이 들어왔을 때 전화를 걸기 위해 최소 시간을 구하는 코드를 만드는 문제였다. 이 문제도 사람마다 푸는 방식이 많이 달랐는데, 대부분의 사람들은 다음과 같이 각 알파벳 별로 케이스를 만들고 케이스에 해당하는 카운트를 만들어 문제를 해결하였다. import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); int count = 0; int k = s.length(); for(int i = 0; i ..

백준 문제 풀이 - 1차원 배열 단계 - 5579번 과제 안 내신 분...?

백준 문제를 풀어 보던 중 5579번에서 생각보다 애를 먹었다. 기본적인 문제였음에도 문제 의도를 제대로 파악하지 못해서 헤맸던것 같다. 해당 문제를 먼저 살펴보자. 해당 문제는 여러가지 방법으로 풀 수 있었는데, 나는 입력받은 배열을 생성해서 정렬한 후 앞의 인덱스의 1의 값을 더한 값과 일치하지 않으면 출력하는 방법으로 풀려고 하였다. 코드는 다음과 같이 구성하였는데 import java.util.*; import java.io.*; class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Array..

백준 문제 풀이 - 반복문 단계

반복문 역시 아직은 브론즈 단계라 그런지 크게 어려운 것은 없었다. 대부분 for문 while문을 사용하여 끝내면 되는 문제들이였고 해당 조건만 잘 맞춰주면 크게 문제 없이 풀 수 있었다. 생각이 필요했던 문제는 2439번 -별찍기 2 (브론즈 4) 였는데 어떤 방법으로 할지 고민하다가 다음과 같이 코드를 구현하였다. import java.util.*; import java.io.*; class Main{ public static int n; public static String s=""; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(..