반응형

 

 

 

컨테이너(Container)

컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공합니다.

예를 들어, Servlet을 실행해주는 WAS는 Servlet 컨테이너를 가지고 있다고 말합니다.

WAS는 웹 브라우저로부터 서블릿 URL에 해당하는 요청을 받으면, 서블릿을 메모리에 올린 후 실행합니다.

개발자가 서블릿 클래스를 작성했지만, 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet 컨테이너입니다.

Servlet컨테이너는 동일한 서블릿에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 서블릿을 실행하여 그 결과를 웹 브라우저에게 전달합니다.

컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것을 말합니다.

 

IoC(Inversion of Control) 

컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 합니다.

예를 들어, 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS입니다.

이렇게 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전이라고 합니다.

 

DI(Dependency Injection)

DI는 의존성 주입이란 뜻을 가지고 있으며, 클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말합니다.

 

DI가 적용 안 된 예

개발자가 직접 인스턴스를 생성합니다.

class 엔진 {

}

class 자동차 {
     엔진 v5 = new 엔진();
}

 

 

 

Spring에서 DI가 적용된 예

엔진 type의 v5변수에 아직 인스턴스가 할당되지 않았습니다.

컨테이너가 v5변수에 인스턴스를 할당해주게 됩니다.

@Component
class 엔진 {

}

@Component
class 자동차 {
     @Autowired
     엔진 v5;
}

 

 

 

 

Spring에서 제공하는 IoC/DI 컨테이너

  • BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있습니다.
  • ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천됩니다. 트랜잭션처리, AOP등에 대한 처리를 할 수 있습니다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 습니다.
  • BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화 와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있도록 합니다.
  • BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있습니다.
반응형
반응형

 

 

 

1. Bottom-up 방식

www.acmicpc.net/problem/9461

 

9461번: 파도반 수열

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의

www.acmicpc.net

 

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, ...

여기서 규칙이 보이나요?

규칙은 전전 값과 전전전 값을 더한 것입니다.

이를 bottom-up 방식으로 구현해보면 아래와 같습니다.

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

int total, N;
vector<long long int> v;

int main(void) {
    
    cin >> total;
    
    v.push_back(0);
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    
    
    for(int k=0; k<total; k++){
        cin >> N;
        
        for(int i=(int)v.size(); i<=N; i++){
            v.push_back(v[i-2] + v[i-3]);
        }
        
        printf("%lld\n", v[N]);
    }
    
    return 0;
}

 

 

 

 

 

 

 

 

반응형

'Programming > Coding Test' 카테고리의 다른 글

백준 11653 - 파이썬 처음으로 사용해보기 !  (0) 2021.01.09
9. C++ String 문법 정리  (0) 2021.01.05
7. 순열과 조합 정리  (0) 2021.01.01
6. DFS - 부분집합  (0) 2020.12.31
5. STL 정리  (0) 2020.12.29
반응형

 

 

 

CASE 1) 순서 O, 중복 X

www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

#include <stdio.h>
#include <iostream>
using namespace std;

int N, M;
int arr[9];
int ch[9];

void dfs(int depth){
    if(depth == M){
        for(int i=0; i<M; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
        return;
    } else {
        for(int i=1; i<=N; i++){
            if(ch[i] == 0){
                ch[i] = 1;
                arr[depth] = i;
                dfs(depth + 1);
                ch[i] = 0;
            }
        }
    }
}

int main(void) {
    
    cin >> N >> M;
    
    dfs(0);
    
    return 0;
}

 

- check 배열과 arr 배열, 그리고 depth 를 사용하여 구현하였다.

 

 

 

 

CASE 2) 순서 X,  중복 X

www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

#include <stdio.h>
#include <iostream>
using namespace std;

int N, M;
int ch[9];
int arr[9];

void dfs(int s, int depth){
    if(depth == M){
        for(int i=0; i<M; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
        return;
    } else {
        for(int i=s; i<=N; i++){
            if(ch[i] == 0){
                ch[i] = 1;
                arr[depth] = i;
                dfs(i, depth+1);
                ch[i] = 0;
            }
        }
    }
}

int main(void) {
    
    cin >> N >> M;
    
    dfs(1, 0);
    
    return 0;
}

 

 

 

 

CASE 3) 순서 O, 중복 O

www.acmicpc.net/problem/15651 

 

15651번: N과 M (3)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

#include <stdio.h>
#include <iostream>
using namespace std;

int N, M;
int arr[10];

void dfs(int depth){
    if(depth == M){
        for(int i=0; i<M; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
        return;
    } else {
        for(int i=1; i<=N; i++){
            arr[depth] = i;
            dfs(depth+1);
        }
    }
}

int main(void) {
    
    cin >> N >> M;
    
    dfs(0);
    
    return 0;
}

 

 

CASE 4) 순서 X, 중복 O

www.acmicpc.net/problem/15652

 

15652번: N과 M (4)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

#include <stdio.h>
#include <iostream>
using namespace std;

int N, M;
int arr[10];


void dfs(int s, int depth){
    if(depth == M){
        for(int i=0; i<M; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
        return;
    } else {
        for(int i=s; i<=N; i++){
            arr[depth] = i;
            dfs(i, depth+1);
        }
    }
}

int main(void) {
    
    cin >> N >> M;
    
    dfs(1, 0);
    
    return 0;
}

 

 

 

< 결론 >

순서 X - 0부터 시작

순서 O - s 부터 시작

중복 X - ch 배열 안씀

중복 O - ch 배열 씀

 

 

 

 

반응형

'Programming > Coding Test' 카테고리의 다른 글

9. C++ String 문법 정리  (0) 2021.01.05
8. 동적계획법  (0) 2021.01.02
6. DFS - 부분집합  (0) 2020.12.31
5. STL 정리  (0) 2020.12.29
[C++] 백준 2573 빙산 - 테스트 케이스  (0) 2020.11.15
반응형

 

1. 핵심 개념

값이 총 3개일 때, 트리 모양으로 가정합니다. D(1), D(2), D(3), D(4)가 있습니다. D() 안의 숫자는 level을 뜻합니다. D(1)은 0 0 0이고, D(2)는 첫째 값, D(3)는 둘째 값, D(4)는 셋째 값입니다. 루트부터 전위 순회를 하면서 왼쪽은 ch[level] = 1; 오른쪽은 ch[level] = 0; 입니다. level 1은 0 0 0입니다. level이 4일 때 부분집합을 출력합니다. 

 

void dfs(int level){
    
    if(level == N){
        if(!isEmpty()){
            for(int i=0; i<N; i++){
                if(ch[i] == 1)
                    sum += v[i];
            }
            if(sum == S)
                cnt++;
            sum = 0;
        }
        return;
    }
    
    ch[level] = 1;
    dfs(level+1);
    ch[level] = 0;
    dfs(level+1);
    
}

 

 

 

 

2. 백준 1182

www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

#include <stdio.h>
#include <iostream>
#include <vector>
#define MAX_NUM 25
using namespace std;

int N, S;
int num;
int cnt = 0;
int ch[MAX_NUM];
vector<int> v;
int sum;

int isEmpty(){
    for(int i=0; i<N; i++){
        if(ch[i] == 1)
            return 0;
    }
    return 1;
}

void dfs(int level){
    
    if(level == N){
        if(!isEmpty()){
            for(int i=0; i<N; i++){
                if(ch[i] == 1)
                    sum += v[i];
            }
            if(sum == S)
                cnt++;
            sum = 0;
        }
        return;
    }
    
    ch[level] = 1;
    dfs(level+1);
    ch[level] = 0;
    dfs(level+1);
    
}

int main(void) {
    
    cin >> N >> S;
    
    for(int i=0; i<N; i++){
        cin >> num;
        v.push_back(num);
    }
    
    dfs(0);
    
    cout << cnt << endl;
    
    return 0;
}

 

반응형

'Programming > Coding Test' 카테고리의 다른 글

8. 동적계획법  (0) 2021.01.02
7. 순열과 조합 정리  (0) 2021.01.01
5. STL 정리  (0) 2020.12.29
[C++] 백준 2573 빙산 - 테스트 케이스  (0) 2020.11.15
런타임에러 1 - return 1 return 0 return -1 의미  (0) 2020.11.14
반응형

 

 

 

1. Stack

- 선언

stack <char> s1;

 

- push

s1.push('c');

 

- pop

s1.pop();

 

- 스택 가장 위의 값

s1.top();

 

- 예제

#include<string>
#include <iostream>
#include <stack>
using namespace std;

bool solution(string s)
{
    bool answer = true;
    stack <char> s1;
    
    for(int i=0; i<s.length(); i++){
        if(s[i] == '('){
            s1.push(s[i]);
        } else if(s[i] == ')'){
            if(s1.empty() || s1.top() == ')'){
                answer = false;
                break;
            }
            s1.pop();
        }
    }
    
    if(!s1.empty()){
        answer = false;
    }
    
    
    return answer;
}

 

 

 

 

 

 

2. Queue

- 선언

Queue<int> q;

 

- push

q.push(1);

 

- pop

q.pop();

 

- 큐 맨 앞의 값

q.front();

 

- 큐 맨 뒤의 값

q.back();

 

- 비었는지 체크

q.empty();

 

- 큐에 몇 개의 값이 들었는지

q.size();

 

 

 

 

 

반응형
반응형
반응형

+ Recent posts