목록전체 글 (58)
공부 기록장
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VdXFR/btq4SYdd1Ev/hq73TxhbbK3kGzLnkXiIhK/img.png)
스프링 MVC도 지난번에 다뤘던 MVC 패턴과 크게 다르지 않다. 똑같이 model 과 view controller로 나눠져 있는 패턴이고, Spring이 제공하는 트랜잭션 처리나 DI, AOP등을 손쉽게 사용할 수 있다는 특징이 있다. 이 것은 Spring MVC의 요청 흐름이다. DispatcherServlet이 중간에서 모든 요청을 처리해주는 컨트롤러의 역할을 한다. 모든 클라이언트에게서 요청을 전달 받고, Controller에게 클라이언트의 요청을 전달한다. 컨트롤러가 리턴한 결과값을 view에게 보내주어 알맞은 응답을 생성하는 역할을 한다. HandlerMapping에서는 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정해준다. URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CmbiX/btq4R3Z2ZaL/bj0dcCcAMH5AIkm4s3b6N0/img.png)
스프링을 시작할 때, 가장 먼저 해 주어야 하는 것이 기본 설정을 세팅하고, 알맞은 곳에 필요한 것들을 주입시키는 것이다. 스프링 빈은 기본적으로 싱글톤으로 만들어진다. 따라서, 컨테이너가 제공하는 모든 빈의 인스턴스는 항상 동일하다. 만약, 컨테이너가 항상 새로운 인스턴스를 반환하게 하고 싶은 경우 scope를 prototype으로 설정해주어야 한다. 스프링 빈 설정은 주로 xml 문서 형태로 기술되어 있는데, 단순하고 사용하기 쉽기 때문이다. bean 태그를 이용해 pom.xml, root-context.xml, servlet-context.xml 에 필요한 설정들을 넣어준다. 빈을 사용할때 constructor-arg나 property 설정들도 들어있는데, constructor-arg 태그는 생성자..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Eubus/btq4Sl0sFEo/ZTZe0JiV8v6QF6i7qTxnX1/img.png)
이번 포스팅에서는 스프링에서 중요한 개념 중 하나인 loC과 DI에 대해 다뤄보려고 한다. 먼저 loC란, Inversion of Control, 즉 제어의 역행을 뜻한다. 조금 풀어서 얘기하자면, 기존에는 필요한 위치에서 개발자가 필요한 객체 생성 로직을 구현했다면, 객체 생성을 컨테이너에게 위임해서 처리하는 방식이다. 스프링에서는 인터페이스를 호출해서 사용하기 때문에 구현 클래스 교체가 용이하다. 컨트롤러에서 각 서비스를 이용할 때, 인터페이스 객체를 불러서 사용하므로 클래스 내용이 변경되어도 따로 변경해주어야 할 것이 없다. 또, factory를 호출해서 팩토리가 구현 클래스를 생성하므로 인터페이스 변경시 팩토리만 수정하면 된다. 따라서 service를 이용하는 쪽에서는 인터페이스만 알고 있으면 어..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wX4bd/btq4F7O89rr/3M11b7UdqMY0yIeKHk5oGK/img.png)
이 문제는 백준 골드 4 레벨 문제이다. 처음에는 이렇게 풀었는데 시간초과가 났다. O(nlogn)정도 인 것 같은데, O(n) 에 풀어야 하나보다. 이 식은 처음부터 수열을 검사하면서 목표치가 넘으면 cnt에 값을 추가해주고, 다음 번호부터 검사하는 것이다. import java.util.Scanner; public class 부분합_1806 { //시간초과 static long cnt, ans; static int[] map; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); long S = sc.nextInt(); map = new int[N]; for(int i=0; i..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/L9KYI/btq4wujFDVc/8wmZHPMFXJZSVKSjQiL06k/img.png)
이 문제는 백준 실버 2 레벨의 문제이다. 이 문제는 실버 2임에도 불구하고 뭔가 생각해야 할 것도 많고 되게 까다로웠다. 처음에는 식을 어떻게 세워야 할 지 몰라서 헤매고 있었는데 스터디 같이 하던 오빠가 어떤식으로 풀면 되는지 알려주었다. 1) (나 [와 같은 열리는 괄호가 나오면 스택에 넣어주기 2) 닫히는 괄호가 나왔을 때 스택 제일 위에 있는 것이 짝이 맞는 열리는 괄호라면 2 혹은 3 으로 바꿔주기 3) 열리는 괄호가 아니라면 스택을 검사하며 열리는 괄호가 나올 때 까지 값을 더해주거나 곱해주기. 4) 단, 짝이 맞지 않는 열리는 괄호가 나오면 올바르지 않은 문장이기 때문에 종료. 이게 가장 큰 틀이다. import java.util.Scanner; import java.util.Stack; ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/oB8kX/btq38flAscp/qghW4QYU96UEzKBcnCBjZ0/img.png)
이 문제는 백준 골드 5 문제이다. 이 문제는 다익스트라 알고리즘을 이용해서 풀었다. 다익스트라 알고리즘에 대해서는 포스팅을 한 적이 있는데 간단하게 설명하자면 현재 있는 위치로부터 방문하지 않은 곳 중 가장 비용이 적게 드는 점을 찾아가는 것이다. 그렇게 가다가 목적지가 나오면 끝내는 알고리즘이다. 이 문제는 다른것보다 입력처리가 제일 오래걸렸다. 버스의 비용이 0일 경우를 생각하지 않고 코딩을 했는데, 버스의 비용이 0인 경우가 문제가 됐다. 2 2 1 2 0 1 2 10 1 2 의 예시를 넣으면 10이 나와서 이걸 처리하는게 오래걸렸다. 그래서 입력을 받을 때 1) 맵을 작은 값으로 초기화해주고, 2) 이번에 들어온 값이 이미 가지고 있는 값보다 작으면 새로운 값 넣어주기 3) 맵이 초기값 그대로라..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bf9DHt/btq3JAyr7ZB/fi24VWOFHigPbYDWQ9I4LK/img.png)
이 문제는 백준의 골드 4 레벨 문제이다. 처음에는 이 문제를 보고 각 단어가 어떤 문자를 가지고 있는지 확인한 뒤에 각 문자가 포함된 단어가 몇 개 있는지 계산해서 정렬을 해 주는 방법을 사용해 보려고 했다. 테스트케이스가 맞길래 될 줄 알았는데 생각해보니 반례가 있었다. 그래서 생각해 낸 방법이 조합을 이용해서 푸는 것이다. 알파벳은 총 26개가 있고, 그 중 5개는 무조건 가르쳐야 하는 단어이기 때문에 acint를 제외한 K-5개의 알파벳을 뽑아서 가장 많은 단어를 읽을 수 있는 조합을 찾아내면 된다. 1 )일단 a,c,i,n,t는 모든 단어에 들어가기 때문에 단어를 5개 미만으로 가르치면 읽을 수 있는 단어가 없으므로 다른 연산을 하지 않고 0을 출력한 뒤 종료시킨다. 2) 2차원 boolean ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bLTL1l/btq3DKnYhdH/8w3anT4UVe3tvKAvL6gx21/img.png)
이 문제는 백준의 골드 5레벨 문제이다. 어제부터 어떤 분이 정리해두신 코딩테스트 대비를 위한 문제 리스트를 풀고 있는데, 레벨별로 정말정말 정리를 잘 해두셨다. 이 문제도 그 문제 중 하나였다. 시뮬레이션 기본 문제라고 하셨는데, 사실 골드 5 레벨 치고는 좀 쉬웠던 것 같다. 문제 푸는 시간보다 블로그 포스팅이 더 오래걸릴 수도 있겠다는 생각이 들 정도로..? 이 문제는 빗물이 쌓인 부분들을 계산하면 되는 문제인데, 1) 2차원 배열을 만들어서 땅이 있는 부분이라면 1을 저장해준다. 2) 2차원 배열을 처음부터 돌면서 2-1) 이번에 도착한 곳이 땅인데 지난번에 도착한 곳도 땅이라면 temp = 0 2-2) 이번에 도착한 곳이 빈 공간인데 지난번에 땅이였다면 카운팅 스타트! 2-3) 이번에 도착한 곳..