SMTP 란 ? (Java / Oracle 기반 구현 )
·
개발
메일 구현은 해보았으나 SMTP 를 정확히 이해하지 못한 거 같아 글을 작성하게 되었다.이메일은 어떻게 전송될까? 인터넷 이메일 시스템 구조를 볼 때 크게 3개의 요소로 구분할 수 있다. 1. User Agent 사용자 장치이며, 메일을 작성하거나 읽기 등의 기능을 수행한다.일반적으로 컴퓨터나 스마트폰 등을 생각하면 된다.  2. Mail Server메일을 송수신을 제어하고, 다수 사용자들의 메일박스를 관리한다.구글이나 네이버와 같은 메일 서버들을 칭한다. 메일 서버는 메일 전송을 위한 출력큐 (outgoing message queue) 와, 메일을 관리하는 메일박스 (mail box) 를 지닌다. 3. SMTP (Simple Mail Transfer Protocol) 메일을 전송할 때 사용되는 프로토콜..
1238 - 파티 (Java)
·
백준
문제https://www.acmicpc.net/problem/1238 풀이다익스트라 문제이다. 단순히 n개 각각 마을에서 x 마을로의 최단 거리를 다익스트라로 구하고,그리고 x 마을에서 n개의 마을로의 최단거리를 다익스트라로 구해도 풀리긴한다. x마을에서 n개 마을로의 거리는 한번만에 다 구할 수 있으나,n개의 마을에서 x 최단거리를 구하기 위해서는 n + 1 번의 다익스트라를 돌아야하기에 굉장히 비효율적이다. 해결법은 간선의 방향을 반대로 하고 다익스트라를 수행하면 n 개의 마을에서 x 로 가는 가중치를 한번에 구할 수 있다.n개 각각 마을에서 x로 향하는 길들을 반대로 설정하고 x에서의 다익스트라를 수행하면,그건 각 마을에서 x로 향하는 최단거리가 된다. 이렇게 하면 단 두번의 다익스트라로 문제를 풀..
Iterable, Iterator, ListIterator
·
자바
컬렉션 프레임워크에서, Iterator 를 사용해서 객체를 순회하고 값을 확인할 수 있다. 예시를 보자. Set set = new HashSet();set.add(1);set.add(2);set.add(3);Iterator iterator = set.iterator();while (iterator.hasNext()) { System.out.println(iterator.next());}// 결과는 1 2 3 순서대로 출력.  Iterator 는 뭐고, iterator() 메소드는 어떻게 호출되는걸까? Iterable 인터페이스 자바에서 Iterator 인터페이스는 컬렉션의 요소를 순차적으로 접근하는 방법을 제공하는 인터페이스이다. 아래 도식도를 보자.  컬렉션 인터페이스는 Iterable 인터페이스..
5397 - 키로커 (Java)
·
백준
문제https://www.acmicpc.net/problem/5397 풀이커서를 이동하고, 중간에 값을 삽입하고, 삭제하고 하는 등의 요건을 살펴보면 이 문제가 연결리스트 문제라는걸 알 수 있다. 구현은 단순하다, LinkedList와 ListIterator 를 선언하고 입력받은 값을 순회하면서 로직을 처리한다. "" 또한 마찬가지이다. "-" 가 나올경우에, 가장 앞을 가리키고 있는지 확인하고 (커서가 가장 앞) , 그게 아니라면 연결리스트에서 값을 삭제하고, iterator 를 한 칸 앞으로 이동시켜준다. 그 외에 일반 문자열은 현재 iterator 가 가리키고 있는 위치에 넣어주면 된다. 코드import java.util.*;import java.io.*;public class Main { p..
[Spring] @Bean 메소드 파라미터 자동주입
·
자바
@Configuration 어노테이션이 선언된 클래스내에서,@Bean 어노테이션이 선언된 메소드는 다른 빈에 의존하여 자신을 초기화 할 수 있다. 이 때, 다른 빈이 파라미터로 들어올 때, 자동주입이 가능하다. 예시로 확인해보자. 1. 타입 자동주입   들어오는 파라미터의 타입이 선언된 빈이 하나라면, 해당 빈을 자동으로 주입해준다.  2. 이름 자동주입  만약 위와 같이 BeanA 라는 인스턴스 2개가 빈으로 등록되어 있다면? 이 때는 타입으로만 판단하기에 모호하기에 이름이 같은 빈을 주입해준다. ※ Bean 의 이름?@Bean 어노테이션이 달린 메소드의 기본 이름은 메소드명이 된다. 위 같은 경우에는 bean1, bean2 가 된다.그 외에도 개발자가 원하는 이름을 설정 하기 위해선 @Bean(nam..
2295 - 세 수의 합 (Java)
·
백준
문제https://www.acmicpc.net/problem/2295 풀이알고보면 참 단순한 문제다. 우리는 x + y + z = k 라는 공식을 활용해서 답을 찾아야 하는데, 이 표현은 x + y = k - z 로도 나타낼 수 있다는 점을 알아야 한다. x + y + z 의 경우의 수를 모두 구할려면 O(N^3) 이 걸릴 테지만  이를 조금 비틀어  x + y = k - z  를 활용하면 양쪽의 식들 값을 구하기 위해서 O(N^2) 의 시간에 풀이할 수 있다. x + y 의 값들을 set 에 저장한다음, k - z 값이 set에 있는지 확인하면 된다. 이 때 k 값이 가장 큰 값을 찾고 있기 때문에 배열을 오름차순으로 정렬해준다음,가장 뒤에서부터 k 값을 세팅해서 탐색을 시작하면 된다. k 값을 큰 값..
2493 - 탑 (Java)
·
백준
문제https://www.acmicpc.net/problem/2493 풀이스택을 활용한 문제이다. 스택을 활용해서 내 기준 왼쪽편에 나보다 큰 건물을 빠르게 찾을 수 있다. 스택에는 [건물번호, 건물높이] 형태로 저장하며, case 1. 스택이 빈 경우에는 -> 앞에 나보다 큰 건물이 없다는 뜻, 0번으로 세팅하고 스택에 현재 건물을 넣어준다. case 2. 스택 값이 건물높이가 나보다 작다면           -> 스택 값이 나보다 클 때까지 빼준다. (스택에 있는 높이가 크다면 내가 찾던 가장 가까운 건물을 의미한다.)           -> 큰 값이 나오면 해당 건물 번호로 세팅해주고, 스택에 현재 건물을 넣어준다. 정리하면 스택에서 현재 건물보다 큰 값이 나올때까지 빼주다가, 큰 값이 나오면 해당..
1253 - 좋다 (Java)
·
백준
문제https://www.acmicpc.net/problem/1253 풀이투 포인터를 활용해서 풀어야하는 문제이다. 값을 오름차순 정렬한다음, 가장 앞과 가장 뒤에 포인터를 위치시킨다. 포인터에 위치한 두 값을 더한 값이, 내가 선택한 값보다 크다면 -> 뒤의 포인터를 줄인다.내가 선택한 값보다 작다면 -> 앞의 포인터를 늘린다. 포인터를 이동할 때 선택한 숫자는 선택이 안되야하므로 이 부분은 예외처리 해주면 된다. 코드import java.util.*;import java.io.*;import java.util.stream.Collectors;public class Main { public Integer solution() throws Exception { BufferedReader ..
1079 - 쇠 막대기 (Java)
·
백준
문제https://www.acmicpc.net/problem/10799 풀이괄호만 보면 스택먼저 생각나는 만큼, 스택을 활용해서 풀면 된다. 여는 괄호는 현재 막대기의 개수를 의미한다. 그러다가 이제 닫는 괄호가 나오면, 레이저를 의미한다. 이때 스택에서 여는괄호 하나를 꺼내서 닫는 괄호와 쌍을 맞추어 레이저가 구성된다. 그러면 막대들이 절단될것이고, 3개의 막대들이 있다고 가정 하면 3개가 잘려나갈것이다. 단, 앞서 레이저였는데 (닫는 괄호가 나왔는데) 또 닫는 괄호가 나온다면 이는 막대의 끝을 의미한다.막대의 끝을 만나면 1개를 추가해줌으로 레이저로 인해 잘린 오른쪽 값을 체크할 수 있다.   코드import java.util.*;import java.io.*;public class Main { ..
2116 - 주사위 쌓기 (Java)
·
백준
문제https://www.acmicpc.net/problem/2116 풀이  첫번째 주사위는 6면 모두 아랫면으로 향할 수 있기 때문에, 초기 값 기준으로 6번의 반복문을 돌아 경우의 수를 판단한다. 그 외의 주사위는 한칸씩 쌓으면서 아랫면이, 아래 주사위의 윗면과 맞닿으면 된다. 이 때, 새롭게 쌓는 주사위의 아랫면과 윗면을 제외한 4면 중 가장 큰 값을 취하고, 이 과정을 반복하면 된다.  주사위 쌓는 과정을 상세하게 설명하면, 1. 주사위를 쌓을때 아래 주사위의 윗면 값을 현재 주사위의 인덱스 어디에 있는지 찾는다.   (만약 아랫면 주사위의 윗면이 5라고 했을때, 현재 주사위에 5가 어느 위치에 있는지 찾으면 된다.)※ 주사위는 정수형 배열로 인덱스로 위치를 파악할 수 있다.  2. 해당 인덱스와..