코드 저장소

공부에는 끝이 없다!

분류 전체보기 79

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

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

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

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

시간 복잡도와 Big O(빅-오) 표기법

어느덧 시간 복잡도 단계에 접어 들었다. 사실 시간 복잡도 쪽은 정확한 개념을 잡지 못한 상태여서 우선 개념을 먼저 잡는 것이 필요했다. 간단하게 찾아 보았던 정보들을 정리해 보고자 한다. 시간 복잡도 - 효율에 관하여... 백준에서 문제를 풀다보면 코드의 정확도는 당연히 갖춰줘야 하지만 가독성이나 효율성에 대해서 여러번 생각해 볼때가 있다. 특히, 속도라는 것은 바로 눈으로 확인 가능한 부분이기도 하고 속도가 나오지 않으면 코드자체가 돌지 않는 경우도 발생하기에 어떤 방법이 가장 빠른지 판단이 필요할 때가 있는데, 이때 알고리즘의 실행속도를 수치적으로 계산한 것을 시간복잡도라고 한다. 시간 복잡도의 핵심 요소는 반복문인데, 입력이 들어왔을 때 반복을 얼마나 하는지가 보통 알고리즘의 수행 시간을 증가시키..

Spring Security - 카카오 Oauth2 로그인 구현

Springboot를 이용하여 블로그를 만드는 클론 코딩을 진행하던 중, 오류가 발생하여 정리해 본다. 현재 기본적인 틀은 구성이 된 상태이며, 카카오 API를 이용하여 권한까지 발급 받아 유저 정보까지는 return 받은 상태이다. 이를 이용하여 받은 정보로 가입 여부를 확인 하고, 비가입자면 회원가입 로직을 태운 후, 로그인 처리를 하는 로직을 구성 중이다. 듣고있는 강의에서는 UsernamePasswordAuthenticationToken을 이용하여 authentication 객체를 생성하고 SecurityContextHolder에서 현재 context를 가져와 set 해주는 방법으로 현재 세션에 바로 등록되도록 하였다. User kakaoUser = User.builder() .username(k..

SpringBoot 2023.08.29

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

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

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

이전의 문제를 뒤집은 문제이다. 이번에는 10진법의 수 N이 주어지고 이 숫자가 B 진법에서 어떤 수인지 출력하는 프로그램을 작성하는 문제이다. 우선 진법 변환의 단계에 대해서 알아보자. 10진법을 다른 진법으로 변환하는 것은 다음과 같다. 예를 들어 10진수를 25진수로 바꾼다고 가정할 때 1. 변환하려는 진법의 기수를 정한다. 여기서는 25진수를 변환하므로 기수는 25가 된다. 2. 10진수를 변환하려는 진법의 기수로 나눈 몫과 나머지를 계산한다.몫은 다음 계산의 기준이 되며, 나머지는 현재 자리의 값으로 사용된다. 3.나머지를 해당 진법에서 사용하는 숫자로 변환한다. 25진수에서는 0부터 24까지의 숫자가 사용되므로 숫자 10부터는 알파벳 대문자 A부터 사용 된다. 4.나머지를 변환한 값을 앞에서부..

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