C++: 문자열

index

#include <string>

string str = "0123456"; // 기본적인 생성자
str.size();             // 7
str.front();            // 첫 char, 0
str.back();             // 마지막 char, 6

추가/제거

추가: append, insert

string str = "0123456"
str.append("str");         // "0123456str"
str.append("01234", 2, 2); // "012345623", index:2부터 length:2개
str.insert(3, "str");      // "012str3456"

제거: clear, erase

string str = "0123456"
str.clear(); // ""

string::iterator iter1 = str.begin();
string::iterator iter2 = str.end();
iter1 += 1;
iter2 -= 1;

str.erase(3);     // "012"
str.erase(2, 2);  // "01456"
str.erase(iter1); // "023456"
str.erase(iter1, iter2); // "06"

수정/변환

수정: replace // @todo: replace

변환: substr

string str="0123456";
str.substr(3);        // "3456"
str.substr(3, 2);     // "34"

검색/비교

검색: find

string str = "0123456";
str.find("2");            // 2
auto pos = str.find("8"); // pos == string::npos

비교: compare

string str1 = "ab";
string str2 = "bc";
string str3 = "Ab";
string str4 = "Ac";
string str5 = "A";
string str6 = "A";
string str7 = "z";
string str8 = "";

// A.compare(B): A<B 인지, A>B 인지 검사, A<B라면 0보다 작은 값, A>B라면 1, A==B라면 0보다 큰 값
auto a1 = str1.compare(str2); // c<0, 첫 번째 char 부터 차례대로 검사: a < b 이므로
auto a2 = str1.compare(str3); // c>0, a > A
auto a3 = str3.compare(str4); // c<0, index=0, A == A, index=1, b < c
auto a4 = str4.compare(str5); // c>0, c > ""
auto a5 = str5.compare(str6); // c==0, A == A
auto a6 = str6.compare(str7); // c>0, A < z
auto a7 = str7.compare(str8); // c>0, z > ""

자료구조: priority_queue

연산

#include <queue>

// 초기화 2가지
// 1. vector에서 복사
// 내림차순 정렬이 기본 정렬
vector<int> vec{1, 2, 3, 4, 5}
priority_queue<int> pq1(vec.begin(), vec.end());
print(pq1); // 5 4 3 2 1 (기본: 내림차순)

// 2. 내림차순 / 오름차순 정렬
// <자료형, vector<자료형>, greater/less<자료형>>
priority_queue<int, vector<int>, greater<int>> pq2;

시간복잡도

  • push(): O(logN)
  • pop(): O(logN)
  • top(): O(1)
  • order: O(logN)

참고

알고리즘: 프로그래머스: 라면공장

알고리즘: 프로그래머스: 라면공장

참고

라면공장

자료구조: priority_queue

풀이 (1차)

  • stock에 남아있는 밀가루가 충분하다면, 현재 날짜까지 밀가루가 공급된 수량 중 큰 순서대로 공급하면 된다.
  • 큰 수량 부터 차례대로 받을 수 있는 자료구조가 필요하다.
  • 우선 순위 힙 (priority_queue) 를 사용한다.

  • priority_queue에는 supplies를 담는다.

풀이 (2차)

  • stock < istock <= i 로 수정
  • i 는 0일 부터 시작
  • 따라서 istock이 같을 때 밀가루 공급

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(int stock, vector<int> dates, vector<int> supplies, int k) {
	int answer = 0;

	priority_queue<int> supplyPQueue;

	int j=0;
	for (int i=0; i<k; i++) {
		// 공급 받는 일정일 때, queue에 저장한다.
		if (i == dates[j]) {
			supplyPQueue.push(supplies[j]);
			j += 1;
		}

		// 저장된 stock 이 i보다 작아진다면
		// queue에 저장했던 밀가루를 pop
		if (stock <= i) {
			stock += supplyPQueue.top();
			supplyPQueue.pop();
			answer += 1;
		}
	}
	return answer;
}

코드

noodle.cpp

케라스: 수치입력 다중클래스분류 모델

데이터 입력

code2idx = {'c4': 0, 'd4': 1, ... }
idx2code = {0: 'c4', 1: 'd4', ... }

즉, code2idx는 코드를 숫자로, idx2code는 숫자를 코드로 만드는 코드

참고

순환 신경망 모델 만들어보기

수치 입력 -> 다중 클래스 분류

  • 입력값이 주어졌을 때, 클래스를 분류하기 위해 “one-hot 인코딩”을 사용
    • 삼각형, 사각형, 원을 구분한다고 하면, 삼각형은 [1, 0, 0], 사각형은 [0 1 0], 원은 [0 0 1]
    • 케라스에서 제공하는 to_categorical() 함수로 처리 가능

레이어: softmax

  • 활성화 함수
  • 입력되는 값을 클래스별로 확률 값이 나오도록 출력