분류 전체보기
-
비트(Bit)와 비트마스킹(Bitmasking) 비트마스킹 기법에 대해 학습한 내용을 정리해둔다. 자바의 비트 연산자와 비트 이동 연산자를 알아보고, 비트마스킹이 무엇인지 알아보도록 하겠다. 자바 비트 연산자 & bit AND 연산자 비교하는 비트가 모두 1이면 1 # a = 22, b = 14 # a & b 00010110 (AND) & 00001110 ------------------ 00000110 | bit OR 연산자 비교하는 비트 중 하나라도 1이면 1 # a = 22, b = 14 # a | b 00010110 (OR) | 00001110 ------------------ 00011110 ^ bit XOR 연산자 양쪽 비트가 같으면 0, 다르면 1 # a = 22, b = 14 # a ^ b..
[Algorithm] 비트마스킹(Bitmasking) (Java)비트(Bit)와 비트마스킹(Bitmasking) 비트마스킹 기법에 대해 학습한 내용을 정리해둔다. 자바의 비트 연산자와 비트 이동 연산자를 알아보고, 비트마스킹이 무엇인지 알아보도록 하겠다. 자바 비트 연산자 & bit AND 연산자 비교하는 비트가 모두 1이면 1 # a = 22, b = 14 # a & b 00010110 (AND) & 00001110 ------------------ 00000110 | bit OR 연산자 비교하는 비트 중 하나라도 1이면 1 # a = 22, b = 14 # a | b 00010110 (OR) | 00001110 ------------------ 00011110 ^ bit XOR 연산자 양쪽 비트가 같으면 0, 다르면 1 # a = 22, b = 14 # a ^ b..
2022.12.20 -
백준 문제 풀이 : 부분수열의 합(1182번)(Java) 문제 문제 확인하기 풀이 n개의 정수들을 원소로 갖는 수열 arr이 있을 때, arr의 부분 집합의 총 원소의 합이 s인 경우가 몇개인지 구하는 문제이다. n의 최대값, 그러니까 수열 arr의 최대 길이는 20이므로, 완전 탐색을 이용하여 문제를 해결할 수 있다. 단순히 모든 경우를 고려하면 된다. n이 4인 수열 {1, 2, 3, 4}가 주어졌다고 가정하자. 이 수열의 부분 집합은 {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}, {1, 2, 3}, {1, 2, 4}, {2, 3, 4}, {1, 2, 3, 4}가 존재한다. 이 부분 집합들을 하나씩 찾으면서 해당 부분 집합의 ..
[백준] 부분수열의 합(1182번) - Java백준 문제 풀이 : 부분수열의 합(1182번)(Java) 문제 문제 확인하기 풀이 n개의 정수들을 원소로 갖는 수열 arr이 있을 때, arr의 부분 집합의 총 원소의 합이 s인 경우가 몇개인지 구하는 문제이다. n의 최대값, 그러니까 수열 arr의 최대 길이는 20이므로, 완전 탐색을 이용하여 문제를 해결할 수 있다. 단순히 모든 경우를 고려하면 된다. n이 4인 수열 {1, 2, 3, 4}가 주어졌다고 가정하자. 이 수열의 부분 집합은 {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}, {1, 2, 3}, {1, 2, 4}, {2, 3, 4}, {1, 2, 3, 4}가 존재한다. 이 부분 집합들을 하나씩 찾으면서 해당 부분 집합의 ..
2022.12.20 -
팩토리 메서드(Factory Method)와 추상 팩토리(Abstract Factory) 패턴 팩토리(Factory) 패턴을 사용하면 객체 생성을 캡슐화 할 수 있다. 팩토리 패턴에는 팩토리 메서드(Factory Method) 패턴과 추상 팩토리(Abstract Factory) 패턴이 있다. 팩토리 메서드 패턴 개념 팩토리 메서드 패턴은 인스턴스 생성 방법을 상위 클래스에서 결정하되, 생성될 인스턴스가 구체적으로 어떤 클래스의 인스턴스인지는 하위 클래스에서 결정하도록 하는 디자인 패턴을 말한다. 팩토리 메서드 패턴을 사용하면 인스턴스 생성을 위한 프레임워크와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있다. 아래는 팩토리 메서드 패턴을 클래스 다이어그램으로 표현한 것이다. Creator 추상 클..
[디자인패턴] 팩토리 메서드(Factory Method)와 추상 팩토리(Abstract Factory) 패턴팩토리 메서드(Factory Method)와 추상 팩토리(Abstract Factory) 패턴 팩토리(Factory) 패턴을 사용하면 객체 생성을 캡슐화 할 수 있다. 팩토리 패턴에는 팩토리 메서드(Factory Method) 패턴과 추상 팩토리(Abstract Factory) 패턴이 있다. 팩토리 메서드 패턴 개념 팩토리 메서드 패턴은 인스턴스 생성 방법을 상위 클래스에서 결정하되, 생성될 인스턴스가 구체적으로 어떤 클래스의 인스턴스인지는 하위 클래스에서 결정하도록 하는 디자인 패턴을 말한다. 팩토리 메서드 패턴을 사용하면 인스턴스 생성을 위한 프레임워크와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있다. 아래는 팩토리 메서드 패턴을 클래스 다이어그램으로 표현한 것이다. Creator 추상 클..
2022.12.20 -
Job 관련 내용 정리 개요 스프링 배치의 Job에 대해 학습한 내용을 기록하려 한다. 먼저 Job에 대해서 알아본다. Job의 개념은 무엇인지, 스프링 배치에서 제공하는 Job에는 어떤 것들이 있는지 알아본다. 다음으로 Job을 생성하고 설정하기 위해 어떻게 해야하는지 알아본다. Job 개념 Job은 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다. Job Configuration을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체이다. Job은 여러 Step을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성해야 한다. 스프링 배치는 Job을 인터페이스로 제공하며, Job의 기본 구현체도 함께 제..
[Spring Batch] Job 관련 내용 정리Job 관련 내용 정리 개요 스프링 배치의 Job에 대해 학습한 내용을 기록하려 한다. 먼저 Job에 대해서 알아본다. Job의 개념은 무엇인지, 스프링 배치에서 제공하는 Job에는 어떤 것들이 있는지 알아본다. 다음으로 Job을 생성하고 설정하기 위해 어떻게 해야하는지 알아본다. Job 개념 Job은 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다. Job Configuration을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체이다. Job은 여러 Step을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성해야 한다. 스프링 배치는 Job을 인터페이스로 제공하며, Job의 기본 구현체도 함께 제..
2022.12.19 -
템플릿 메소드(Template Method) 패턴 템플릿 메소드 패턴은 상위 클래스에 알고리즘의 골격의 정의하고 알고리즘의 일부 구현을 하위 클래스에 위임하여 알고리즘을 재사용할 수 있도록 하는 패턴을 말한다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수 있다. 템플릿 메소드 패턴을 사용하면 부모 클래스에서 알고리즘의 골격을 제공하기 때문에 추후 알고리즘에 변경이 일어나더라도 부모 클래스 한 군데만 수정하면 된다는 장점이 있다. 예시 템플릿 메소드 패턴이 어떻게 구현되는지 예시로 확인해보자. 아래 Tea 클래스는 추상 클래스로 make() 메서드에서 알고리즘의 골격을 정의한다. ma..
[디자인패턴] 템플릿 메소드(Template Method) 패턴템플릿 메소드(Template Method) 패턴 템플릿 메소드 패턴은 상위 클래스에 알고리즘의 골격의 정의하고 알고리즘의 일부 구현을 하위 클래스에 위임하여 알고리즘을 재사용할 수 있도록 하는 패턴을 말한다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수 있다. 템플릿 메소드 패턴을 사용하면 부모 클래스에서 알고리즘의 골격을 제공하기 때문에 추후 알고리즘에 변경이 일어나더라도 부모 클래스 한 군데만 수정하면 된다는 장점이 있다. 예시 템플릿 메소드 패턴이 어떻게 구현되는지 예시로 확인해보자. 아래 Tea 클래스는 추상 클래스로 make() 메서드에서 알고리즘의 골격을 정의한다. ma..
2022.12.18 -
백준 문제 풀이 - 포도주 시식 (2156 문제) 문제 문제 확인하기 풀이 조건부터 확인해보자. 포도주 n잔이 주어진다고 했다. 입력받은 n잔의 포도주를 담은 배열을 wines라는 배열로 초기화하겠다. 첫번째 잔을 1로 표시하기 위해 wines[n+1]로 선언하고 인덱스 1부터 n까지 초기화 하자. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] wines = new int[n + 1]; for (int i = 1; i
[백준] 포도주 시식 (2156번 문제)백준 문제 풀이 - 포도주 시식 (2156 문제) 문제 문제 확인하기 풀이 조건부터 확인해보자. 포도주 n잔이 주어진다고 했다. 입력받은 n잔의 포도주를 담은 배열을 wines라는 배열로 초기화하겠다. 첫번째 잔을 1로 표시하기 위해 wines[n+1]로 선언하고 인덱스 1부터 n까지 초기화 하자. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] wines = new int[n + 1]; for (int i = 1; i
2022.12.18 -
백준 문제 풀이 - 가장 긴 증가하는 부분 수열 (11053 문제) 문제 문제 확인하기 풀이 증가하는 부분 수열이란 배열 arr이 주어졌을 때, 특정 몇몇 원소를 제외한 수열이 계속해서 이전 원소보다 큰 형태의 수열을 말한다. 예를 들어 { 1, 3, 7, 4, 2, 5, 6 } 이라는 배열이 있다고 하자. 이 배열에 대한 증가하는 부분 수열은 { 1, 3, 7 } { 1, 3, 4, 5, 6 } { 1, 2, 5, 6 } 와 같은 수열이 될 수 있다. 가장 긴 증가하는 부분 수열이란, 위 증가하는 부분 수열들 중에서 가장 긴 길이의 수열을 말한다. 여기서는 { 1, 3, 4, 5, 6 } 수열이 길이 5로 가장 길기 때문에, 해당 수열이 가장 긴 길이의 수열이 된다. 어떻게 이를 구할 수 있을까? 내가..
[백준] 가장 긴 증가하는 부분 수열 (11053번 문제)백준 문제 풀이 - 가장 긴 증가하는 부분 수열 (11053 문제) 문제 문제 확인하기 풀이 증가하는 부분 수열이란 배열 arr이 주어졌을 때, 특정 몇몇 원소를 제외한 수열이 계속해서 이전 원소보다 큰 형태의 수열을 말한다. 예를 들어 { 1, 3, 7, 4, 2, 5, 6 } 이라는 배열이 있다고 하자. 이 배열에 대한 증가하는 부분 수열은 { 1, 3, 7 } { 1, 3, 4, 5, 6 } { 1, 2, 5, 6 } 와 같은 수열이 될 수 있다. 가장 긴 증가하는 부분 수열이란, 위 증가하는 부분 수열들 중에서 가장 긴 길이의 수열을 말한다. 여기서는 { 1, 3, 4, 5, 6 } 수열이 길이 5로 가장 길기 때문에, 해당 수열이 가장 긴 길이의 수열이 된다. 어떻게 이를 구할 수 있을까? 내가..
2022.12.18 -
백준 문제 풀이 - 쉬운 계단 수 (10844번 문제) 백준 10844번 : 쉬운 계단 수 본문 제한 시간 제한 메모리 제한 1초 256MB 문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 예제 입력 1 1 예제 출력 1 9 예제 입력 2 2 예제 출력 2 17 풀이 어떻게 문제를 풀 수 있을지 '계단 수'를 직접 작성해보면서 규칙을 확인해보자. 먼저 N이..
[백준] 쉬운 계단 수 (10844번 문제)백준 문제 풀이 - 쉬운 계단 수 (10844번 문제) 백준 10844번 : 쉬운 계단 수 본문 제한 시간 제한 메모리 제한 1초 256MB 문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 예제 입력 1 1 예제 출력 1 9 예제 입력 2 2 예제 출력 2 17 풀이 어떻게 문제를 풀 수 있을지 '계단 수'를 직접 작성해보면서 규칙을 확인해보자. 먼저 N이..
2022.12.17 -
피보나치 함수 (BOJ : 1003) 백준 1003번 : 피보나치 함수 본문 제한 시간 제한 메모리 제한 0.25초 128MB 문제 다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다. int fibonacci(int n) { if (n == 0) { printf("0"); return 0; } else if (n == 1) { printf("1"); return 1; } else { return fibonacci(n‐1) + fibonacci(n‐2); } } fibonacci(3)을 호출하면 다음과 같은 일이 일어난다. fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다. fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fib..
백준 1003번 : 피보나치 함수피보나치 함수 (BOJ : 1003) 백준 1003번 : 피보나치 함수 본문 제한 시간 제한 메모리 제한 0.25초 128MB 문제 다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다. int fibonacci(int n) { if (n == 0) { printf("0"); return 0; } else if (n == 1) { printf("1"); return 1; } else { return fibonacci(n‐1) + fibonacci(n‐2); } } fibonacci(3)을 호출하면 다음과 같은 일이 일어난다. fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다. fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fib..
2022.12.16 -
인증/인가 오류 처리 우리는 Spring Security를 통해 사용자의 권한을 처리하게 된다. Security 설정을 통해 특정 엔드포인트로의 요청에 필요한 권한 등을 설정할 수 있다. @Bean public SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception { http // ... .and() .authorizeRequests() .antMatchers("/end-point1").hasRole(Role.USER.name()) .antMatchers("/end-point2").hasRole(Role.ADMIN.name()) .antMatchers("/end-point3").permitAll() // ... ..
[Spring Security] AuthenticationEntryPoint, AccessDeniedHandler를 통한 인증/인가 오류 처리인증/인가 오류 처리 우리는 Spring Security를 통해 사용자의 권한을 처리하게 된다. Security 설정을 통해 특정 엔드포인트로의 요청에 필요한 권한 등을 설정할 수 있다. @Bean public SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception { http // ... .and() .authorizeRequests() .antMatchers("/end-point1").hasRole(Role.USER.name()) .antMatchers("/end-point2").hasRole(Role.ADMIN.name()) .antMatchers("/end-point3").permitAll() // ... ..
2022.12.15