목록전체 글 (179)
有希
스프링 DI 컨테이너에는 인스턴스의 생성과 소멸 타이밍에 호출되는 메서드를 결정하기 위해 @PostConstruct와 @PreDestroy라는 2개의 어노테이션이 있다. (Java SE 6 이상) @PostConstruct: 초기 처리를 하는 메소드 선언. 메소드 이름은 상관없다. 인수는 없고, 반환형은 반드시 void이다. @PostConstruct public void init() {...} @PreDestroy: 종료 처리를 하는 메소드 선언. 마찬가지로 인수는 없고, 반환형은 void이다. @PreDestroy public void stop() {...} @PostConstruct는 DI컨테이너에 의해 인스턴스 변수에 무언가 인젝션된 다음에 호출된다. 즉, 인젝션된 값으로 초기 처리를 할 때 사용..
DI컨테이너가 관리한, 주로 인젝션을 위한 인스턴스를 설정하는 것. 클래스 선언 앞에 @Component를 붙이면 스프링의 DI컨테이너가 찾아서 관리하고 @Autowired가 붙은 인스턴스 변수나 메서드에 인젝션해준다. 또한, 이름을 붙여서 관리하고 싶으면 @Component("이름") 처럼 이름을 붙여서 사용할 수도 있다. 용도에 따라 표시를 명확히 하기 위해 4가지로 분화된다. @Controller: 프레젠테이션 층 스프링 MVC용 어노테이션(사용자에게 보여지는 화면) @Service: 비즈니스 로직 층 Service용 어노테이션. @Component와 동일 @Repository: 데이터 액세스 층의 DAO 어노테이션 @Configuration: Bean 정의를 자바 프로그램에서 실행하는 JavaCo..
인젝션(의존 관계)를 받기 위한 설정 @Autowired public void setFoo(Foo foo) { this.foo = foo; } 인젝션, 의존 관계에 대해 생각해 봤는데, 이런 의미인거 같다. -> "내 기능을 완성하기 위해 다른 클래스가 필요하다.(의존)" 즉, 나 스스로 완전하지 않고 다른 녀석이 있어야 한다. 인자가 여러개여도 가능하고, 생성자에도 가능하다. 그리고, autowired가 어떻게 알아서 적절한 클래스를 가져와서 완성시켜주는가? 에 대한 답은 -> @Component가 붙은 녀석들 중 맞는 녀석을 데려온다. 이렇게 하면 인젝션이 필수가 아니게 할 수도 있다. @Autowired(required = false) public void setFoo(Foo foo) { this...
적절한 자료구조를 쓰면 풀 수 있다. 1. 숫자면 아무 거리낌 없이 더한다. 2. 문자라면 완성된 문자인지 확인하고, 완성됐다면 map에서 확인하고 값 꺼내서 저장한다. answer = answer * 10 + value; 하는 부분이 핵심이라면 핵심? #include #include #include using namespace std; int solution(string s) { int answer = 0; map match; match["zero"] = 0; match["one"] = 1; match["two"] = 2; match["three"] = 3; match["four"] = 4; match["five"] = 5; match["six"] = 6; match["seven"] = 7; match..
풀라면 다양하게 풀 수도 있지만, 이게 가장 효율적인거 같다. 1. unordered_set에 뽑은 숫자들 저장하며 0개수 센다 2. 맞춘 숫자 센다 3. 맞춘숫자 + 0개수 가 전부 맞은게 최고 순위이므로 저장 4. 맞춘숫자의 순위만 저장. 순위 저장은 6개 맞추면 1등 이니까 7-맞춘숫자 했다. 그 이하는 6등 이니까 저렇게 했다. 1개 맞추면 6이지만 0개 맞추면 7이므로 삼항 연산자를 사용하여 6으로 맞춘다. #include #include #include using namespace std; vector solution(vector lottos, vector win_nums) { vector answer; unordered_set nums; int zeros = 0; //0이 아닌 값 set에 ..
public static void main(String[] args) { ProductSampleRun productSampleRun = new ProductSampleRun(); productSampleRun.execute(); } execute 에서는 Product Service 를 DI로부터 가져오고 productservice.addProduct를 통해 100엔짜리 공책을 추가한다. productservice.findByProductName을 통해 공책과 가격을 가져온다. 구조는 이렇다. ProductSampleRun ProductService ProductDAO DB Service와 DAO는 인터페이스이고, 인터페이스를 구현한 클래스가 따로 있다. 우리는 Service라는 인터페이스를 통해 '로직..
난 이진탐색에 약하다. 문제에서 O(log n)이내에 해야한다고 힌트를 줬으므로 이진탐색으로 풀어야 한다. 우선 while문에 들어가고 나서는 mid를 정하고 mid가 hit인지 판단한다. 아니라면 이제 high와 low중 mid로 옮길 녀석을 찾아야 한다. 문제에서 주어진 4567012의 예시를 생각해보자. 1. 5를 찾는 경우 1) mid = 3, 7이다. 아니므로 else들로 이동 2) 첫번째 else문의 조건에 해당한다. 3) high = mid-1, 2로 조정 4) mid = 1, 찾았으므로 1 반환 2. 0을 찾는경우 1) mid=3, 7이다. 아니므로 else로 이동 2) 첫번째 else 3) low = mid+1, 4로 조정 4) mid = 5, else로 이동 5) high = 4 6) ..
dividend와 divisor의 부호 경우의 수를 4가지로 나눠서 빼가면서 계산할 경우에는 시간 제한에 걸린다. 이러면 bit 조작을 하라는 말이고... 쌈빡한 풀이가 있어 공유한다. https://leetcode.com/problems/divide-two-integers/discuss/1516367/Complete-Thinking-Process-or-Intuitive-Explanation-or-All-rules-followed-or-C%2B%2B-code Complete Thinking Process | Intuitive Explanation | All rules followed | C++ code - LeetCode Discuss Level up your coding skills and quickl..
다들 똑같은 풀이를 올리고 장황하게 설명하고 있다. 나는 처음에는 () 를 하나의 문자열로 두고, idx에 따라 삽입하는 방안을 생각했다. 만약 n이 2라면 괄호가 2개가 있다는 말이다. 우선 ()를 넣고, (와 ) 전후 자리인 3곳에 ()를 삽입하면 차례대로 ()(), (()), ()() 가 된다. 이것을 set에 넣고 다시 vector에 넣는 방법을 생각했다. 하지만, 불필요하게 set을 써야하고 다시 vector로 복사하는 비용이 발생한다. -> 다들 이렇게 푸는데에는 이유가 있다. 가장 핵심은 if가 2개 붙어있는 부분이라고 생각한다. 우선 backtrack 함수에 cur가 "(" 인채로 왔다고 생각하면 if가 2개인 함수에 의해서 "((" 혹은 "()"가 되어 다시 backtrack함수가 호출된..
head가 주어졌으므로 어렵게 생각할 필요 없이 vector에 순서대로 다 담은 다음 idx로 편하게 작업했다. class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { vector nodes; ListNode* cur = head; while(cur != nullptr) { nodes.push_back(cur); cur = cur->next; } //지울 타겟 int target = nodes.size() - n; //첫번째 노드를 삭제하는 것이라면 if(n == nodes.size()) { if(nodes.size()==1) head = nullptr; else head = nodes[1]; } //마지막 노드를 삭제하는..