전체 글 170

[자바] 백준 2667번 단지번호 붙이기 (BFS/DFS) 2021-06-15

우선 문제를 보자마자 그래프 탐색 알고리즘을 이용하여 "연결요소"의 개수를 파악한 다음 그걸 리스트에 담고, 리스트를 정렬해준 다음, 차례로, 리스트 사이즈출력, 리스트요소들 하나씩 출력 해주면 끝난다. 풀이법을 생각해내는데 5분도 걸리지 않았지만.... 실제 정답을 내는데 디버깅 포함 1시간 걸린거 같다... 내가 실수한 부분은, 이 문제는 "최단거리"나, "백트레킹" 등, 그래프 탐색에 있어서 특수한 조건이 없기 때문에, DFS또는 BFS중 아무거나 사용 가능하다. 이유는 두 기법 모두, 연결된 노드를 전부 방문할수 있고, 그에 맞춰서 카운트 값을 올려줄수 있기 때문이다. 어제 쓴 포스트에서는 BFS를 이용해서 풀었기에, DFS로 풀어볼까 하면서 코드를 짰더니... 계속 리스트 사이즈 1, 값은 48..

[자바] 백준 2178번 미로탐색 (BFS) 2021-06-14

전형적인 그래프 탐색 문제이며, "최단" 거리+미로의 탈출을 구하여야 함으로 BFS를 써야 한다. 최단 거리를 구하는 문제에서, DFS가 아닌 BFS를 쓰는 이유는 한가지 계층(똑같은 길이나 방법)을 이용해서 한번 이동을 한 거리가 모두 같음이, 자연스럽게 구현이 되기 때문이다. 또한 같은 계층으로써 방문한 노드가 목적지랑 같을시, 계층 한번이동할때(큐에 넣을때) 넣어준 카운트 값으로 쉽게 최단거리를 출력할 수 있다. 또한 미로의 탈출은 깊이우선 탐색을 하게되면, 해답을 찾지못해도, 계속 깊이가 끝날때까지 탐색을 하기에, 비효율 적이다. 그래서 난, BFS를 통해 이문제 풀이법을 구현해 보았다. 그러나 내가 이전 포스트에서 쓴 촌수문제에서, 큐에 넣을때(한번 계층이동이 이루어질때) 바로 카운트값을 더해주..

[자바]백준 10451번 순열 사이클. 2021-06-11

우선 순열이란 단어를 보자마자, 아 백트레킹을 이용한 순열을 구하는 것인가? 라는 생각이 들었다. 그러나 문제를 계속 읽으니, 그냥 각 인덱스값, 1부터 N까지에 대응되는 값을 이용하여, 인접리스트나 인접행렬을 통해 노드와 노드사이의 관계를 표현한 다음, 연결요소의 개수를 구하면 된다는 것을 알게 되었다. 처음 난, 이전에 풀어봤던 아파트 단지문제나 배추심기 문제 등에서 좌표평면에 (x,y) 좌표로 노드간의 연결관계를 표현 한 것을, 상화좌우 인접한 좌표로 dfs를 통해 끝까지 탐색하며1을 0으로 바꾸고, 그 곳들을 for문을 통해 처음부터 하나하나씩 dfs로 돌릴때, 해당 좌표가 1이면 카운트 해주는 식으로 풀이를 하면 될줄 알았다. 하지만 이 문제는, 좌표로 나타내었을때, 각 좌표들간의 상관관계가 존..

JDBC의 작동원리, 기본 코드. 2021-06-10

우선, JDBC는 자바에서 클라이언트로부터 받은 데이터의 요청(쿼리)를 인터페이스를 통해 표준화된 함수들로 Connection(연결), Statement(쿼리 문장실행), Resultset(결과패치) 등을 제공하는 템플릿이다. 왜 이런 JDBC가 필요하냐면, 사용자가 UI에서 어떤 정보를 클릭하면, 그 쿼리를 실질적인 DBMS(데이터 저장소)에 넘겨 줄 수 있다. 그런데 이 DBMS는 많은 종류가 있다. MySQL, ORACLE, RADIS 등... 이런 dbms의 종류에 함수의 이름이 각각 다를 것이고, 그렇다면, DBMS 를 바꿀때 마다, 그에 맞는 코드를 또 다시 짜야 할 것이다. 이런 애로사항을 방지하기위해 JDBC라는 자바에서 표준적으로 제공하는 라이브러리를 통해 쿼리를 작성하면, 각 DBMS에..

Programming/JDBC 2021.06.10

무작위로 주어진 수들의 순열,조합 구하기. (백트레킹) 2021-06-10

우선적으로 사용자로부터 N과 M 입력 값을 받는다. 그리고, 연산의 대상이되는 수들을 사용자로부터 N개 입력받는다. N P M을 구해보겠다. 우선 순열이나, 조합 모두 dfs의 방법중 하나인 백트레킹을 이용한다. 1.모든 노드를 탐색해야한다. 2.노드 탐색의 조건이 있다.(한번 방문한 노드는 방문하지 않는다. 그러므로 dfs를 통한 백트레킹 방법을 이용한다. import java.io.*; import java.util.*; public class Main { static int[] arr; static int[] output; static boolean[] value; static int N; static int M; public static void main(String[] args) throws I..

한가지 Pointcut으로 여러 Aspect를 사용하기, 프록시 적용순서. 2021-06-09

우린 앞전에 @Pointcut 설정을 하면서, excution 명시자에 대해서 쓴 적이 있다. 간단히 설명하자면, excution 명시자는 Adivce를 적용할 메서드를 지정할때 사용한다. 간단히 말해서 Pointcut은 "where" 이고, Advice는 "when"이다. 그런데 Advice를 Aspect의 실질적인 적용이라 해도 무방하다. 이유는 애초에 @Around 가 붙은 메서드에서 공통의 기능을 실행하고, 대상객체의 메서드도 호출하여서, 앞/뒤, 익셉션 유무등에 따라 코드를 짤수 있기 때문이다. 즉, Advice의 적용은 Aspect 의 적용이다. @Around 애너테이션에 공통의 기능과 "when" 그것을 실행할지 구현하기 때문이다. 그래서 Pointcut이 정하는 범위는 그냥 Advice의 ..

스프링의 프록시 생성방식과 적용 실제 main 함수 사례. 2021-06-08

우선 이전 포스트의 빈 설정 클래스를 보자. @Configuration @EnableAspectJAutoProxy public class Appctx { @Bean public ExeTimeAspect exeTimeAspect() { return new ExeTimeAspect(); } @Bean public Calculator calculator() { return new RecCalculator(); } } 이렇게 빈 객체 설정을 완료한 후, 대상객체를 calculator(), 프록시를 exeTimeAspect()로 하는 스프링 AOP를 실제로 main 메서드에 적용해서 함수의 작동시간을 알아보는 코드를 보자. public class MainAspect { public static void main(..

스프링 AOP의 기본 개념: Advice, joinpoint,Pointcut,Aspect 2021-06-07

우선 이전 포스트에서 AOP(Aspect oriented programing)이란 공통의 기능과 핵심기능의 분리를 통해 재사용성을 높여주는 프로그래밍 기법이라고 설명하였고, 스프링은 AOP를 프록시를 통해 구현한다고 설명하였다. 일반적인 AOP구현 방식은 총 3가지 방법이 있다. 1.컴파일 시점에 공통의 기능을 구현한 코드를 넣어준다. 2.클래스 로딩 시점에 바이트 코드에 공통의 기능을 구현한 코드를 넣어준다. 3.런타임 중 프록시 객체를 생성해서 공통의 기능을 삽입한다. 이 3가지 방법중 스프링에서 사용하는 방식은 3번이다. 스프링 AOP는 프록시 객체를 자동으로 만들어서 필요한 시점(PointCut)에 실행해준다. 그래서 공통기능을 구현한 클래스만 알맞게 구현하면 된다. 우선 스프링의 AOP의 용어들..

프록시와 AOP 프로그래밍 [최범균 스프링 5] 2021-06-04

우선 스프링 공식 래퍼런스에는, AOP를 설명하기 위해 '프록시'라는 단어를 사용하고 있다. 프록시란, 간단히 추상적으로 설명하자면, 핵심기능을 제외한 공동의 기능을 한데 묶어서 코드의 변경 없이 사용할수 있도록 만든 클래스이다. 이런 말로하면 이해가 잘 되지 않을테니, 코드로서 설명하겠다. 우선, 정수 num이 주어졌을때, num의 팩토리얼을 를 구하는 기능을 가진 클래스를 2개 만들어 보자. 그런데 다형성을 사용하여 프록시를 통한 공통의 기능을 구현해야 하니, Calculator라는 인터페이스를 만들어서 상속시키자. public interface Calculator { public long factorial(long num); } 다형성 사용을 위해서 인터페이스를 만들어줌. public class I..

빈 라이프사이클과 범위,[최범균 스프링5] 2021-06-03

우선 자바 빈은 AnnotationConfigApplicatonContext 클래스로 대표되는 스프링 컨테이너에 등록되고, 사라지는데 특정한 주기를 갖는다. 쉽게 설명하자면, 객체생성->의존설정->초기화->소멸 인데, 각 단계별로 설명하자면, 1. 객체생성: AnnotationConfigApplicationContext 의 생성자로, 자바 설정클래스가 들어갔을때, 설정클래스에 구현된 자바빈 들의 객체를 생성하고 컨테이너에 등록한다. 2.객체를 생성해서 컨테이너에 등록하는 과정에서 만약 @Autowired에 의한 자동의존 주입이 필요하다면, 기존에 등록된 자바빈 객체들중 해당 타입과 같은 빈을 주입한다. 여기까지는 앞서 포스트에서 설명했고, 우리도 다 알고 있는 내용이다. 그러나 다음 두 내용은 새로운 내..