반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

핵심 문제와 예는 위와 같다. 자연수 n을 넣었을 때, 124나라의 숫자로 변환해주면 되는 문제이다.

1 | 1, 2, 4만을 사용하는 나라? -> 3진법으로 처리
2 | 근데 3진법인데도 0, 1, 2가 아니라, 1, 2, 4이므로 10진수 0부터 10까지 변환해가면서 규칙을 찾아야함.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int n) {
    string answer = "";
    string base[3= { "4""1""2" }; // 계산해보면 3진수로 0은 4에 매칭, 1과 2는 그대로.
    
    while(n != 0)
    {
        answer = base[(n%3)] + answer; // 나머지 연산을 통해, 일의 자리부터 구해나감.
        if(n%3 == 0// 만약에 3의 배수를 나누면
            n = (n-1)/3// 몫을 구할 때 하나를 빼야 한다.
        else
            n = n/3
    }
    return answer;
}
cs

base 라는 배열 대신에, answer = "412"[a] + answer; 이런 식으로 풀이한 경우도 있다. "412"[n]은 굉장히 신박했다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

프로그래머스, 완전탐색, 소수찾기(C++)  (0) 2021.02.22
카카오 2021 문제 - 신규 아이디 추천(C++)  (0) 2021.02.21
다음 큰 숫자  (0) 2021.02.18
문자열 검색  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18
728x90
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <vector>
 
using namespace std;
 
int main(void)
{
    // vector 값 10개를 추가한다.
    vector<int> vec;
    for (int i = 0; i < 10; i++)
        vec.push_back(i);
 
    // iterator를 이용한 순회
    vector<int>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++)
        cout << *it << endl;
    cout << endl;
 
    // iterator를 포인터처럼 사용할 수 있다.
    it = vec.begin();
    cout << it[3<< endl// 3
    cout << *(it+3<< endl// 3
    cout << *(++it) << endl// 1
    cout << *it++ << endl// 1
    cout << *it << endl// 2
 
    it[0= 100;
    cout << it[0<< endl// 100
    
    *(it+1= 200;
    cout << *(it + 1<< endl// 200
    cout << it[1<< endl// 200
 
    cout << "--------------------------------------------------" << endl;
    vector<int>::const_iterator cit = vec.begin();
    for (cit = vec.begin(); cit != vec.end(); cit++)
        cout << *cit << endl;
    cout << "--------------------------------------------------" << endl;
    cout << cit[-1<< endl;
    cout << cit[-2<< endl;
    cout << cit[-3<< endl;
    cout << cit[-4<< endl;
    cout << cit[-5<< endl;
    cout << cit[-6<< endl;
    cout << cit[-7<< endl;
    cout << cit[-8<< endl;
    cout << cit[-9<< endl;
    cout << cit[-10<< endl;
    // cout << cit[-11] << endl; // 에러 ㅋ
    cout << "--------------------------------------------------" << endl;
    // vec.begin() 실제 요소, vec.end() 요소가 아님 -> 가리킬 수 없음
 
    // 값이 반전되어 출력함
    vector<int>::reverse_iterator rit;
    for (rit = vec.rbegin(); rit != vec.rend(); rit++)
        cout << *rit << endl;
 
    cout << "--------------------------------------------------" << endl;
    vector<int>::const_reverse_iterator crit;
    for (crit = vec.crbegin(); crit != vec.crend(); crit++)
        cout << *crit << endl;
 
    return 0;
}
cs
728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

R-Value, Copy Elision, 이동 생성자, RVO, NRVO  (0) 2021.01.26
자료형 추론 auto / 범위 기반 for  (0) 2021.01.21
Priority Queue  (0) 2021.01.04
Queue  (0) 2021.01.04
Stack  (0) 2021.01.03
728x90
반응형

 

우선 순위 큐란?

Heap 자료 구조를 내부적으로 사용한다.
기본적으로 값이 클수록(문자의 경우 사전 상 뒤의 순서일수록) 우선순위가 높다. <- 이는 우선 순위를 정하기 나름이다.

이렇게 나올줄 알고 이미 c언어로 구현을 해보았다ㅋ 매우

https://typingdog.tistory.com/110

 

C Data Structure - Heap ( Priority Queue, 우선 순위 큐 ) 개념 및 코드 구현

공부를 하고 정리하는 것이 매우 중요하다. 근데 그 정리를 하기가 조금 귀찮은 것이 아니다. 앞으로는 그 때 그 때 정리하도록 하고, 모아두지 말아야겠다.. 업로드 할 것이 한 두 가지가 아니다

typingdog.tistory.com

 

코드 및 실행 결과

----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <queue>
#include <iostream>
#include <string>
 
using namespace std;
 
int main(void)
{
    priority_queue<string> pq;
    string words[3= {
        "Apple",
        "Banana",
        "Corn"
    };
    for (int i = 0; i < 3; i++)
        pq.push(words[i]);
    while (!pq.empty())
    {
        cout << pq.top() << endl;
        pq.pop(); // 분명히 top 에서 Pop 으로 뽑아내지만 선입 선출의 순서가 아닌 우선 순위대로 값을 뽑아낸다. 
        // 내부적으로 사용되는 자료 구조 방식이 다르기 때문에.
    }
 
    return 0;
}
cs

----

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

자료형 추론 auto / 범위 기반 for  (0) 2021.01.21
Iterator 사용 방법 예시  (0) 2021.01.05
Queue  (0) 2021.01.04
Stack  (0) 2021.01.03
Tuple  (0) 2021.01.03
728x90
반응형

큐란?

컨테이너를 확장 및 축소하여 기능을 제한하거나 특정 기능과 특징을 사용하도록 만든 것을 컨테이너 어댑터라고 하는데, 큐 또한 바로 그것이다. 

내부적으로 dequeue, list 등의 컨테이너로 동작하며 기본적으로는 dequeue로 동작한다. vector는 안된다! 왜냐하면 vector는 앞에서 값을 빼는 pop 기능이 없기 때문이다.( vector::push_back( )과 vector::pop_back( )만 존재함 )

사용되고 있는 내부 컨테이너를 변경하려면 queue<data type, list<int>> listack; 이러한 식으로 진행하면 된다. ( 스택에서 사용될 data type, 변경할 컨테이너 구조: list or dequeue등)

코드 및 실행 결과

----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <queue>
#include <iostream>
#include <string>
 
using namespace std;
 
int main(void)
{
    queue<string> qu;
    string words[3= {
        "Apple",
        "Banana",
        "Corn"
    };
 
    for (int i = 0; i < 3; i++)
        qu.push(words[i]);
 
    while (!qu.empty())
    {
        cout << qu.front() << endl;
        qu.pop();
    }
    return 0;
}
cs

----

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Iterator 사용 방법 예시  (0) 2021.01.05
Priority Queue  (0) 2021.01.04
Stack  (0) 2021.01.03
Tuple  (0) 2021.01.03
Pair  (0) 2021.01.03
728x90
반응형

스택이란?

컨테이너를 확장 및 축소하여 기능을 제한하거나 특정 기능과 특징을 사용하도록 만든 것을 컨테이너 어댑터라고 하는데, 스택이 바로 그것이다.

내부적으로 vector, dequeue, list 등의 컨테이너로 동작하며 기본적으로는 dequeue로 동작한다.

내부 컨테이너를 변경하려면 stack<data type, list<int>> listack; 이러한 식으로 진행하면 된다. ( 스택에서 사용될 data type, 변경할 컨테이너 구조: list or vector 등)

코드 및 실행 결과

----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stack>
#include <iostream>
#include <string>
 
using namespace std;
 
int main(void)
{
    stack<string> st;
    string words[3= {
        "Apple",
        "Banana",
        "Corn"
    };
 
    for (int i = 0; i < 3; i++)
        st.push(words[i]);
    
    while (!st.empty())
    {
        cout << st.top() << endl;
        st.pop();
    }
    return 0;
}
cs

----

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Priority Queue  (0) 2021.01.04
Queue  (0) 2021.01.04
Tuple  (0) 2021.01.03
Pair  (0) 2021.01.03
Map  (0) 2020.09.15
728x90
반응형

튜플이란?

Tuple 은 Pair 처럼 쌍으로 데이터를 묶거나, 쌍으로 반환 등을 할 때 사용되는 STL 이다.

#include <tuple>에 정의되어 있고, make_tuple 함수를 이용하여 생성이 가능하다.

코드 및 실행 결과

----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <tuple>
 
using namespace std;
 
int main(void)
{
    // 일반적인 추가
    tuple<intchardouble> t1;
    t1 = make_tuple(1'a'1.1);
    
    cout << "get<0>(t1) : " << get<0>(t1) << "/ get<1>(t1) : " << get<1>(t1) << "/ get<2>(t1) : " << get<2>(t1) << endl;
    
    // 튜플 내부 요소 분해하기
    int n = 0
    char ch = 'z'
    double lf = 0.0;
 
    std::tie(n, ignore, lf) = t1; // ignore 로 무시한다.
    cout << " n : " << n << " / ch : " << ch << " / lf : " << lf << endl;
    std::tie(n, ch, lf) = t1;
    cout << " n : " << n << " / ch : " << ch << " / lf : " << lf << endl;
 
    // 에러가 난다.
    //for (int i = 0; i < 3; i++)
    //    cout << get<i>(t1) << endl; // Error 
 
    return 0;
}
cs

----

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Queue  (0) 2021.01.04
Stack  (0) 2021.01.03
Pair  (0) 2021.01.03
Map  (0) 2020.09.15
Set  (0) 2020.09.15
728x90
반응형

Pair

Pair 는 두 자료형을 묶을 수 있다( 무조건 2개를 묶는다 )
first 키워드를 통해 pair 쌍 중 첫 번째 값에, second를 통해 Pair 쌍 중 두 번째 값에 접근 가능하다.

구조체와 템플릿을 이용한 개념이라고 보면 된다.

코드 및 실행 결과

----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
#include <utility>
 
using namespace std;
 
int main(void)
{
    // 일반적인 추가
    pair<intchar> p1;
    p1.first = 1;
    p1.second = 'a';
    
    cout << "p1.first : " << p1.first << " p1.second : " << p1.second << endl;
 
    // make_pair을 통한 추가
    pair<intchar> p2 = make_pair(2'b');
 
    cout << "p2.first : " << p2.first << " p2.second : " << p2.second << endl;
 
    // vector에 값을 넣을 때
    vector<pair<intchar>> pv;
    pv.push_back(make_pair(3'c'));
 
    cout << "pv[0].first : " << pv[0].first << " pv[0].second : " << pv[0].second << endl;
 
    return 0;
}
cs

----

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Stack  (0) 2021.01.03
Tuple  (0) 2021.01.03
Map  (0) 2020.09.15
Set  (0) 2020.09.15
List  (0) 2020.09.14
728x90
반응형

Map은 연관 컨테이너에 속하는 컨테이너의 한 종류이다. 파이썬의 Dictionary 사전과 같은 자료구조를 갖는다.

Map은 사전처럼 Key(단어)를 갖고, 그 Key에 해당하는 Value(뜻)를 갖는다. 왼쪽 그림처럼 Apple이라는 단어를 찾으면 사과라는 뜻이 나오 듯, key 값을 넣으면 value 값이 나오는 형태이다.

Map에 자료를 추가하거나, 자료를 찾기 위해서는 insert(), find() 등의 함수를 사용하지만 Map의 특성으로 인해서 추가와 탐색을 한 형태로 나타낼 수 있다.

  my_map["apple"] = "핸드폰"; my_map["apple"];
"apple" key가 my_map내에 있을 경우
(value = "사과")
(1) "핸드폰" 값으로 대입 갱신. (2) "사과"를 반환
"apple" key가 my_map내에 없을 경우 (3) key - apple / value - 핸드폰으로
map 컨테이너에 추가 됨.
(4) 반환되는 값이 없다.

첫 번째, 기존의 동일한 key가 map에 존재하는데, 동일한 key로 다시 value 값을 등록하는 경우는 갱신된다.
두 번째, 기존의 동일한 key가 map에 존재한다면, 기존의 key값에 해당하는 value 값을 반환시킬 수 있다.
세 번째, key가 map에 존재하지 않는데, key로 value 값을 등록하는 경우 map에 새롭게 추가된다.
네 번째, key가 map에 존재하지 않는다면, key 자체도 없고 그에 따라서 value도 없으므로 반환되는 값이 없다.

간단한 예제로 마무리 지을 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// https://colorscripter.com/
#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
int main(void)
{
    map<stringstring> my_map; // key에 해당하는 string, value에 해당하는 string
 
    my_map["a"= "apple";
    my_map["b"= "banana";
    my_map["c"= "carrot";
 
    cout << "--- key로 접근하여 value을 출력하기. " << endl;
    cout << my_map["a"<< endl;
    cout << my_map["b"<< endl;
    cout << my_map["c"<< endl;
 
    cout << "--- iterator 이용하여 key와 value 출력하기. " << endl;
    map<stringstring>::iterator it;
    for (it = my_map.begin(); it != my_map.end(); it++)
        cout << it->first << " : " << it->second << endl;
 
    return 0;
}
 
cs

10번 라인과 같이 key 값의 자료형과, value 값의 자료형들을 명시해야한다. 또한 22번 라인에도 또한 동일한 자료형을 명시하여 iterator 선언해야한다.

24번 라인에서 map내의 iterator 클래스의 멤버 first와 second는 각각 key와 value를 나타낸다.

map을 공부하다보니 pair 및 multimap도 관련이 생기고, tuple도 정리해야겠다는 생각이 들었다.

다음 시간에 정리해보자.

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Tuple  (0) 2021.01.03
Pair  (0) 2021.01.03
Set  (0) 2020.09.15
List  (0) 2020.09.14
Deque  (0) 2020.09.13
728x90
반응형

 

Set 컨테이너에 대해서 공부해보았다. Set은 연관 컨테이너 중 하나이다. 다음은 연관 컨테이너의 특성이다.

  • 원소들을 검색하기 위한 키(key)를 가지고 있다. (키와 값의 쌍 형태로 저장되는 컨테이너도 있다)
  • 자료들은 정렬되어 있다. (하지만 순서는 의미가 없다)
  • 삽입되는 요소의 위치를 지정할 수 없다.
  • Tree 구조를 기반으로 동작한다.

Set 컨테이너는 '집합'이다. 

중학교 때 배우는 집합의 특징에 대해서 생각해 볼 수 있다.

  • 중복이 허용되지 않는다.
  • 순서가 상관이 없다.

Set이라는 컨테이너는 집합의 특징을 그대로 갖는다. 그리고 이 집합 내에 저장되는 요소를 키(key)라고 한다.

그러나 중복이 허용되는 집합 컨테이너가 존재한다. 다중 집합인 multi-set이다.
중복이 허용되는 것을 제외하면 set과 똑같다. 

간단한 컨테이너 개념이기 때문에 코드로 바로 정리한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// https://colorscripter.com/
#include <iostream>
#include <set>
 
using namespace std;
 
template <typename T>
void print_list(const T& c);
 
int main(void)
{
    set<int> my_set;
    multiset<int> my_multiset;
 
    set<int>::iterator set_it;
    multiset<int>::iterator multiset_it;
 
    cout << "set에서의 요소 추가" << endl;
    my_set.insert(6);
    my_set.insert(7);
    my_set.insert(8);
    my_set.insert(8); // 중복 값이기 때문에 insert가 이루어지지 않음.
    print_list(my_set);
 
    cout << "multi set에서의 요소 추가" << endl;
    my_multiset.insert(100);
    my_multiset.insert(100); // 중복 값 허용이므로 insert가 이루어진다.
    my_multiset.insert(my_set.begin(), my_set.end());
    print_list(my_multiset);
 
    cout << "set에서의 요소 탐색" << endl;
    set_it = my_set.find(8);
    if (set_it != my_set.end())
        cout << *set_it << " 가 발견됨." << endl;
 
    cout << "multi set에서의 요소 탐색" << endl;
    multiset_it = my_multiset.find(100);
    if (multiset_it != my_multiset.end())
        cout << *multiset_it << " 가 발견됨." << endl;
 
    cout << "set에서의 요소 삭제(6)" << endl;
    my_set.erase(6); 
    print_list(my_set);
 
    cout << "multi set에서의 요소 삭제(100)" << endl;
    my_multiset.erase(100); // 100 요소가 여럿인 경우 모두 삭제
    print_list(my_multiset);
 
    return 0;
}
 
 
template <typename T>
void print_list(const T& c)
{
    typename T::iterator it;
    // typename을 붙이는 이유 : 
    // 붙이지 않을 경우 T::iterator에서 iterator을 T 클래스 내의 변수로 생각하기 때문에 T::iterator 자체가 type이라는 것을 명시해야함.
    for (it = c.begin(); it != c.end(); it++)
        cout << "iterator value : " << *it << endl;
    return;
}
cs

먼저, 21, 22번 라인처럼 set 컨테이너에 같은 값을 키로 등록하려고 하는 경우, 나중에 추가되는 중복 값은 추가되지 않고 무시된다. 내부적으로 조건에 의하여 처리된다.

반면, 26, 27번 라인처럼 multiset 컨테이너에서는 중복 값 추가가 허용된다.

46번 라인처럼 multiset컨테이너에서 중복되는 값을 삭제한다면 중복되는 값들 모두 사라진다. 예를 들어 100이 두개 들어있는 multiset의 경우에서 erase(100)을 실행하면 100 두 개가 모두 사라진다.

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Pair  (0) 2021.01.03
Map  (0) 2020.09.15
List  (0) 2020.09.14
Deque  (0) 2020.09.13
모든 컨테이너 공통 멤버  (0) 2020.09.13
728x90
반응형

Deque에 대한 정리 글이다.

STL Container의 한 요소인 Deque에 대해서 공부를 해보았고, 내용을 정리해보았다.

먼저, Deque(디큐? 데크?), 아무튼 이 Deque란 무엇일까? 생각을 해본다. 큐는 큐인데 반대인, 그래서 디(부정) 큐 라고 하는 것인가?

그래서 찾아보았다.

Deque 란?

벡터와 아주 유사한 동적 배열로, 배열의 전단과 후단에서 모두 요소를 추가하고 삭제하는 것을 허용한다라는 점이 벡터와의 차이점이다. 그 외에는 말 그대로 동적 배열이다.

매우 간단하니, 매우 간단한 예제를 들겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
deque<int> dq;
deque<int>::iterator d_it;
 
dq.push_back(300);
dq.push_back(400);
dq.push_front(200);
dq.push_front(100);
 
cout << "인덱스를 이용한 출력" << endl;
for (int i = 0; i < dq.size(); i++)
    cout << "dq[" << i << "] : " << dq[i] << endl;
    
cout << "반복자를 이용한 출력" << endl;
for(d_it=dq.begin(); d_it<dq.end();d_it++)
    cout << "*d_it : " << *d_it << endl;
cs

 

위 코드, 실행결과, 그림이 모든 설명을 다 해줬다.

 

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Set  (0) 2020.09.15
List  (0) 2020.09.14
모든 컨테이너 공통 멤버  (0) 2020.09.13
Iterator( With vector )  (0) 2020.09.13
Vector  (0) 2020.09.12

+ Recent posts