코드 저장소

공부에는 끝이 없다!

백준 24

(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 위 문제 역시 오름차순으로 입력받은 값을 정렬하기만 하면 되는데, 두 문제의 차이는, 최대 값과 중복값의 여부이다. 다만, 위의 문제는 효율성을 검..

백준 문제 풀이 - 일반 수학 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 ..