괄호문제처럼 스택을 사용한다.

 

여는 괄호 ' ( '가 나오면 스택에 넣고

닫는 괄호 ' ) '가 나오면 두가지 케이스로 구분해 처리한다.

  1. 레이저인 경우
    ()인 경우 레이저인데, 레이저로 잘리는 경우 스택에 넣었던 여는 괄호 하나를 제거해줘야한다.
    그리고 스택에 들어있는 쇠막대기의 수를 확인하여 답에 더해준다. 레이저로 자르는 순간 그만큼 갯수가 추가되기 때문이다.
  2. 쇠막대기의 끝부분인 경우
    ))인 경우 쇠막대기의 끝이다. 왜냐하면 문제에 쇠막대기에는 하나 이상의 레이저가 포함된다고 했기 때문이다.
    그래서 그 경우 스택에서 pop해주고 답에 1을 더해주면 된다.

스택 자료구조를 쓰지 않고, 괄호를 세주는 변수를 사용해도 된다.

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

int solution(string arrangement) {
    int answer = 0;
    stack<char> s;
        
    for(auto iter = arrangement.begin(); iter != arrangement.end(); ++iter){
        if(*iter == '('){
            s.push(*iter);
        }else{
            s.pop();
            if(*(iter-1) == '('){//laser
                answer += s.size();
            }else{
                answer++;
            }
        }
    }
    
    return answer;
}

표준 컨테이너

컨테이너는 객체를 담는 객체이다.

이 컨테이너들은 클래스 템플릿으로 구현되어 다양한 타입의 element를 지원한다.

 

컨테이너는 elements를 위한 저장공간을 관리하고, element에 접근하기위한 멤버 함수를 제공한다. 접근할 때에는 직접 element에 접근할 수도 있고 iterator를 통해서 접근할 수도 있다.

 

컨테이너는 프로그래밍을 하면서 가장 일반적으로 사용되는 자료구조들로 이루어져있다.

동적배열(vector), 큐, 스택, 힙(priority_queue), 링크드 리스트(list), 트리(set), 연관배열(map)

 

컨테이너들은 몇몇 멤버함수를 공통적으로 갖는다. 

프로그래밍을 하면서 사용할 컨테이너를 고르는 경우, 컨테이너가 제공하는 기능만으로 결정하는 것이 아니라 컨테이너의 내부 구현된 방식을 이해하고 결정해야한다. 특히 순차 컨테이너의 경우 삽입, 삭제, 접근의 효율성이 차이가 난다.

 

스택, 큐, 우선순위 큐는 컨테이너 어답터이다.

컨테이너 어답터는 완전한 컨테이너 클래스가 아니라 기존 컨테이너 클래스에 의존해 특정한 인터페이스를 제공하는 방식이다.

 

컨테이너 클래스 템플릿

C++11에서 추가된 함수는 배경색을 칠했다.

 

순차 컨테이너

array 배열 클래스
vector 벡터 클래스
deque Double ended queue. 양방향 큐(덱, 데큐, 데크)
forward_list 단방향 리스트
list 리스트(더블 링크드 리스트)

 

컨테이너 어답터

stack 스택 (Last In First Out, 후입 선출, 마지막에 들어온 것이 처음으로 나간다.) 한곳에서 들어오고 나가는 구조
queue 큐 (First In First Out, 선입 선출, 처음에 들어온 것이 처음으로 나간다.) 한쪽은 들어오고 한쪽은 나가는 구조
priority_queue 우선순위 큐

 

연관 컨테이너

set 집합
multiset 여러 키를 갖는 집합
map 맵 (사전형식 자료구조)
multimap 여러키를 갖는 맵

 

순서 없는 연관 컨테이너

unordered_set 순서없는 집합
unordered_multiset 순서없는 멀티키 집합
unordered_map 순서없는 맵
unordered_multimap 순서없는 멀티키 맵

 

'언어 > C++' 카테고리의 다른 글

[C++/STL] Set  (0) 2020.04.26
[C++/STL]벡터(vector)  (0) 2020.02.20
[C++/STL] 리스트(List)  (0) 2020.02.20

벡터

벡터는 크기가 변할수 있는 배열이다.

순차 컨테이너이다.

 

배열처럼 메모리에 연속하여 데이터를 할당하므로 인덱스로 접근이 가능하다.

배열과 다르게 크기가 커져 할당된 크기를 넘어서면 재할당하여 크기를 키운다.

 

다른 순차 컨테이너인 덱(deque), 리스트(list)와 비교해 벡터는 인덱스로 바로 접근하는게 빠르다.

벡터의 끝에 요소를 삽입, 삭제하는 것은 빠르지만 중간이나 앞 부분에 요소를 삽입, 삭제하는 것은 효율적이지 않다.

 

멤버함수

C++11에서 추가된 함수는 배경색을 칠했다.

 

생성자 벡터를 생성한다.
파괴자 벡터를 파괴한다.
operator= 객체를 할당한다.

Iterators

begin 첫번째 element를 가리키는 이터레이터를 반환한다.
end 마지막 element를 가리키는 이터레이터를 반환한다.
rbegin 마지막 element를 가리키는 역 이터레이터를 반환한다. 이터레이터를 증가시키면 역방향으로 그 다음 element를 가리킨다.
rend 첫번째 element를 가리키는 역 이터레이터를 반환한다.
cbegin 첫번째 element를 가리키는 const 이터레이터를 반환한다. 가리키는 객체의 값을 수정할 수 없다.
cend 마지막 element를 가리키는 const 이터레이터를 반환한다. 가리키는 객체의 값을 수정할 수 없다.
crbegin 마지막 element를 가리키는 const 역 이터레이터를 반환한다. 가리키는 객체의 값을 수정할 수 없다.
crend 첫번째 element를 가리키는 const 역 이터레이터를 반환한다. 가리키는 객체의 값을 수정할 수 없다.

Capacity

size 벡터의 크기를 반환한다.
max_size 벡터가 가질 수 있는 element의 최대 크기를 반환한다. 시스템이나 여러 요인에 달려있다.
resize 벡터의 크기를 변경한다. 기존보다 작은 값으로 변경하면 나머지 값들은 파괴된다.
capacity 메모리에 할당된 크기를 반환한다. 벡터의 요소 갯수와 할당된 값은 다를 수 있다.
empty 벡터가 비어있는지 확인한다.
reserve 벡터에 n개의 element를 수용할 수 있도록 요청한다.
shrink_to_fit 컨테이너에 속한 element의 수에 따라 재할당 하도록한다. 많이 할당된 경우 줄이기위해 사용한다.

Element access

operator[] element에 접근한다.
at element에 접근한다.
front 맨 앞의 element에 접근한다.
back 맨 뒤의 element에 접근한다.
data 벡터 내부에서 사용하는 array포인터를 반환한다.

Modifiers

assign 벡터에 값을 할당한다. 기존에 값이 있어도 완전 새로 할당된다.
push_back element를 끝에 추가한다.
pop_back 마지막 element를 제거한다.
insert element를 삽입한다. 인자로 iterator도 같이 넘긴다.
erase element를 제거한다.
swap 다른 벡터의 내용물과 자신의 내용물을 서로 바꾼다
clear 내부 element를 모두 제거한다.
emplace element를 생성 후 삽입한다. 인자로 iterator도 함께 넘긴다.
emplace_back element를 생성 후 맨 뒤에 삽입한다.

 

'언어 > C++' 카테고리의 다른 글

[C++/STL] Set  (0) 2020.04.26
[C++/STL] 컨테이너(Containers)  (0) 2020.02.21
[C++/STL] 리스트(List)  (0) 2020.02.20

리스트

리스트는 순차 컨테이너다.

삽입과 삭제하는데 걸리는 시간이 상수시간만큼 걸린다.

더블 링크드 리스트로 구현되어 있어서 양방향 순회가 가능하다.

 

벡터와 덱, 배열과 비교하면 삽입, 삭제, 요소 이동에 장점을 가지고 있고

직접 접근할 수 없는 것이 단점이다. 접근하는 데 선형 시간이 걸린다.

 

 

멤버함수

C++11에서 추가된 함수는 배경색을 칠했다.

생성자  리스트 객체를 생성한다.
파괴자  리스트 객체를 파괴한다.
operator= 객체를 할당한다.

Iterators

begin 첫번째 요소를 가리키는 이터레이터를 반환한다. 이터레이터를 증가시키면 다음 요소를 가리키게 된다.
end 마지막 요소를 가리키는 이터레이터를 반환한다. 
rbegin 마지막 요소를 가리키는 역 이터레이터를 반환한다. 이터레이터를 증가시키면 시작위치에 가까운 그 다음 요소를 가리키게 된다.
rend 첫번째 요소를 가리키는 역 이터레이터를 반환한다. 
cbegin 첫번째 요소를 가리키는 const 이터레이터를 반환한다. 가리키는 객체의 값은 수정이 불가하다.
cend 마지막 요소를 가리키는 const 이터레이터를 반환한다. 가리키는 객체의 값은 수정이 불가하다.
crbegin 첫번째 요소를 가리키는 const 역(reverse) 이터레이터를 반환한다.  가리키는 객체의 값은 수정이 불가하다.
crend 마지막 요소를 가리키는 const 역(reverse) 이터레이터를 반환한다.  가리키는 객체의 값은 수정이 불가하다.

Capacity

empty 컨테이너가 비어있는지 확인한다.
size 크기를 반환한다
max_size 최대 크기를 반환한다

Element access

front 첫번째 요소에 접근한다.
back 마지막 요소에 접근한다.

Modifiers

assign 컨테이너에 새로운 내용을 할당한다. 새로 쓰여진다.
emplace_front 요소를 생성하고 맨 앞에 삽입한다.
push_front 맨 앞에 요소를 삽입한다.
pop_front 맨 앞 요소를 제거한다.
emplace_back 요소를 생성하고 맨 뒤에 삽입한다.
push_back 맨 뒤에 요소를 삽입한다.
pop_back 맨 뒤 요소를 제거한다.
insert 요소를 삽입한다.
erase 요소를 제거한다
swap 리스트를 다른 리스트와 바꾼다
resize 크기를 변경한다.
clear 리스트 내부 요소를 전부 제거한다.
emplace 생성 후 요소를 삽입한다.

Operations

splice 리스트에서 리스트로 요소를 옮긴다
remove 값으로 요소를 제거한다. 입력된 값과 같은 요소는 모두 제거된다.
remove_if 조건에 맞는 요소를 제거한다. 조건은 함수나 클래스로 만들어질 수 있다.
unique 중복되는 값을 제거한다.
merge 정렬된 리스트를 병합. 정렬하여 병합된다. 
sort 내부 요소를 정렬한다.
reverse 요소의 순서를 뒤집는다.

 

'언어 > C++' 카테고리의 다른 글

[C++/STL] Set  (0) 2020.04.26
[C++/STL] 컨테이너(Containers)  (0) 2020.02.21
[C++/STL]벡터(vector)  (0) 2020.02.20

Dev C++ 설치 경로: https://sourceforge.net/projects/orwelldevcpp/

코딩테스트 준비를 위해 C++로 학습하는데, 무거운 비주얼 스튜디오로 하고 싶지 않아 정보를 찾던 중

 

Dev C++을 알게되어 설치하였다.

 

출처:

https://ndb796.tistory.com/165

 

알고리즘 대회를 위한 C++ 대회 환경 구성하기

이번 시간에는 알고리즘 대회를 위한 C++ 대회 환경을 구성해보도록 하겠습니다. 가장 먼저, 자신의 디버깅 및 개발을 위한 개발환경을 구축하셔야 합니다. 저는 정말정말 가벼운 개발환경인 Dev C++을 선호하는..

ndb796.tistory.com

 

'참고 링크 > 개발' 카테고리의 다른 글

플러터 개발  (0) 2020.03.18
[안드로이드] OpenGL 참고용  (0) 2020.03.13
이펙티브 자바  (0) 2020.03.09
리팩토링 관련 사이트  (0) 2020.03.01
[유니티]너랑나랑개발자 이야기  (0) 2019.12.28
bool isPrime(int number)
{
    if (number == 1)//1은 소수가 아님
        return false;
    if (number == 2)//2는 소수
        return true;
    if (number % 2 == 0)//짝수 제거
        return false;
 
    bool result = true;
    for (int i = 2; i <= sqrt(number); i++)//제곱근 만큼만 구하면 알 수 있음
    {
        if (number% i == 0)//나눠지면 소수 아님
            return false;
    }
 
    return result;
}

'알고리즘 > 지식' 카테고리의 다른 글

[정렬 알고리즘] 합병 정렬  (0) 2020.03.03
[정렬 알고리즘] 삽입 정렬  (0) 2020.03.03
[정렬 알고리즘] 버블 정렬  (0) 2020.03.03
[정렬 알고리즘] 선택 정렬  (0) 2020.03.02
[기본] 정렬 알고리즘  (0) 2020.03.02
#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    //짝수인경우
    int ssize = s.size();
    if(ssize%2 == 0){
        answer.push_back(s[(ssize>>1)-1]);
        answer.push_back(s[(ssize>>1)]);
    }else{
        answer.push_back(s[(ssize>>1)]);
    }
    return answer;
}

'알고리즘 > 풀이' 카테고리의 다른 글

[ALGOSPOT/알고스팟/C++]외발 뛰기  (0) 2020.01.03
[프로그래머스/C++] 숫자 야구  (0) 2019.12.30
[프로그래머스/C++] 모의고사  (0) 2019.11.30
[프로그래머스/Python] 탑  (0) 2019.11.15
[Programmers] 프린터  (0) 2019.11.11
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> a={1,2,3,4,5};
    vector<int> b={2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> c={3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    vector<int> count_vec = {0, 0, 0};
    for(int i=0; i<answers.size();i++){
        if(answers[i]==a[i%a.size()]){
            count_vec[0]++;
        }
        if(answers[i]==b[i%b.size()]){
            count_vec[1]++;
        }
        if(answers[i]==c[i%c.size()]){
            count_vec[2]++;
        }
    }
    //cout<<count_vec[0]<<", "<<count_vec[1]<<", "<<count_vec[2]<<endl;
    //cout<<max_element(count_vec.begin(), count_vec.end()) - count_vec.begin()<<endl;
    int max_v = *max_element(count_vec.begin(), count_vec.end());
    for(int i=0; i< count_vec.size();i++){
        if(count_vec[i] == max_v){
            answer.push_back(i+1);    
        }
        
    }
    return answer;
}

 

'알고리즘 > 풀이' 카테고리의 다른 글

[프로그래머스/C++] 숫자 야구  (0) 2019.12.30
[프로그래머스/C++] 가운데 글자 가져오기  (0) 2019.11.30
[프로그래머스/Python] 탑  (0) 2019.11.15
[Programmers] 프린터  (0) 2019.11.11
[Programmers] Python 위장  (0) 2019.11.11

+ Recent posts