C++ 137

[백준] 1620 with C++

문제설명 입출력 예제 개념 문자열을 입력받아 숫자와 매칭시키는 문제다. 정해진 개수만큼 문자열 입력이 끝나면, 숫자를 입력했을 때 문자열을 출력하고, 문자열을 입력했을 때 숫자를 출력하면 된다. 따라서 2개의 값을 매칭시키는 문제이므로 map 자료구조를 이용해 주면 된다. 풀이 #include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 이 문제를 풀다 보면 시간 초과 문제가 빈번하게 일어난다. 따라서 이를 미연에 방지하기 위해 c언어와의 싱크를 해제해 주고, cin과 cout의 tie를 풀어 시간을 조금이라도 단축시켰다. int n, m; cin >..

Algorithm/백준 2023.02.22

[백준] 1940 with C++

문제설명 입출력 예제 개념 실버 단계에 랭크되어 있지만, 문제만 제대로 이해한다면 브론즈 단계의 문제다. 고유 번호를 합쳤을 때, 갑옷을 만드는 데 필요한 수를 확인하면 간단하게 해결할 수 있는 문제다. 풀이 #include using namespace std; int main() { int N, M, cnt = 0; int ary[150001] = {0}; cin >> N >> M; for (int i = 0; i > ary[i]; 재료의 개수 N, 갑옷을 만드는 데 필요한 개수 M, 재료의 고유 번호 ary를 초기화해준다. for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { if (ary[i] + ary[j] =..

Algorithm/백준 2023.02.21

[자료구조] std::forward_list

std::forward_list개요 앞서 포스팅한 std::vector, std::array같은 연속된 자료 구조에서는 데이터를 임의로 추가하거나 삭제하는 작업이 매우 비효율적이다. vector 자료 구조에서 insert() 함수와 erase() 함수를 예로 들어보자. insert() 함수를 통해 데이터를 삽입하려 하면 지정한 반복자 위치 다음의 모든 원소를 이동시키는 연산이 필요하고, erase() 함수도 특정 위치의 원소를 삭제한 후, 뒤쪽의 원소들을 모두 앞으로 이동해야 한다. 따라서 연결 리스트와 같은 연결된 자료 구조가 필요한 것이다.  기본적인 연결 리스트를 구성하기 위해서는 포인터가 필요하고, new와 delete 연산자를 이용하여 메모리를 할당하고 해제할 수 있어야 한다. C++에서는 기본..

CS/자료구조 2023.02.20

[백준] 3986 with C++

문제설명 입출력 예제 개념 주어진 문자열에서 문자를 하나씩 확인하며 이전 문자와 비교를 하여 좋은 단어인지 확인하는 문제다. 입출력 예제를 분석해보면 다음과 같다. 풀이 #include #include using namespace std; int main() { int num; cin >> num; int cnt = 0; 입력 받을 단어의 개수를 num으로 초기화하고, 좋은 단어의 개수를 초기화할 변수 cnt를 선언한다. for (int i = 0; i > str; stack input; 좋은 단어인지 확인할 문자열을 str로 초기화한다. 그리고 이 문제의 핵심인데, 문자를 하나씩 확인하며 이전 문자와 비교하여 최종적으로 좋은 단어인지 확인할 때 사..

Algorithm/백준 2023.02.20

[백준] 1193 with C++

문제설명 입출력 예제 개념 분수의 규칙을 이용해 n번 째 위치의 분수는 어떤 값인지 추측하는 문제다. 현재 값을 기준으로 증감의 규칙을 추론하여 다음 값을 추측하는 방법이 있고, 입력받은 정수의 위치를 추론하여 접근할 수 있는 방법이 있다. 풀이 풀이(1) 증감폭 이용 #include #include using namespace std; int main() { int num; cin >> num; int i = 0; int x = 1, y = 1; 정수를 입력받고, x/y 꼴로 출력되는 변수 x와 y를 각각 1로 초기화해 준다. 그리고 반복의 횟수를 결정하는 변수 i도 0으로 초기화해 준다. while (i < num) { int an = round(sqrt(2 * i)); // 현재 int bn = r..

Algorithm/백준 2023.02.19

[백준] 1316 with C++

문제설명 입출력 예제 개념 연속된 문자가 나타났을 때, 그 사이에 교차되는 문자가 있는지 확인하는 문제다. 이를 그림으로 나타내면 다음과 같다. 따라서 반복되는 문자열을 모두 지웠을 때 같은 문자가 존재한다면 그룹단어가 아니게 된다는 것을 이용하면 된다. 풀이 #include #include #include using namespace std; int main() { int num = 0; cin >> num; int cnt = 0; 단어의 개수를 num으로 받고, 그룹 단어 개수를 출력할 cnt를 초기화한다. for (int i = 0; i > str; bool check = true; str.erase(unique(str.begin(), str...

Algorithm/백준 2023.02.18

[백준] 2941 with C++

문제설명 입출력 예제 개념 문자열을 크로아티아 알파벳의 규칙에 맞게 변경한 후, 그 개수를 카운팅 하는 문제다. 크로아티아 문자가 생성되는 규칙은 다음과 같다. 문자 =가 있는 경우 이전 문자가 c거나 s인 경우 카운트를 2개가 아닌 하나로 한다. 이전 문자가 z인 경우 카운트를 2개가 아닌 하나로 한다. 이전 문자가 z이며 d인 경우 카운트를 3개가 아닌 하나로 한다. 문자 -가 있는 경우 이전 문자가 c거나 d인 경우 카운트를 2개가 아닌 하나로 한다. 문자 j가 있는 경우 이전 문자가 l이거나 n이 경우 카운트를 2개가 아닌 하나로 한다. 풀이 #include #include using namespace std; int main() { string str; cin >> str; int count =..

Algorithm/백준 2023.02.17

[백준] 4673 with C++

문제설명 입출력 예제 개념 생성자가 없는 숫자인 셀프 넘버를 출력하는 문제다. 문제에서 알 수 있듯이 x라는 숫자가 있을 때, x의 각 자릿수들의 숫자와 x를 더한 숫자는 셀프 넘버가 아니게 된다. 따라서 bool 배열은 만들어 1부터 10000까지 상술한 규칙을 적용해, 해당하는 자리의 숫자를 true로 바꾼 후 false만 출력하면 된다. 풀이 풀이(1) string 이용하기 #include #include using namespace std; int main() { int num = 10000; bool selfnum[10000] = { false }; max 숫자인 10000을 num으로 초기화하고, selfnum를 체크할 bool 배열 selfnum[]을 초기화한다. for (int i = 1;..

Algorithm/백준 2023.02.16

[자료구조] vector with C++ (2)

std::vector 구현  이제부터 vector를 간단하게 구현해 보겠다. 우리의 목적은 크기가 유동적으로 조절되는 배열을 만드는 것이고, 용량은 1.5배씩 늘리도록 하겠다. #include using namespace std;templateclass vector{ T* _data = nullptr; // 데이터의 주소값 int _size = 0; // 크기 int _capacity = 0; // 용량 먼저 벡터에 담을 데이터의 주솟값과, 크기, 용량 변수를 초기화해준다. public: vector() { } // 기본 생성자 ~vector() // 소멸자 { if (_data) // 소멸자가 실행될 때 벡터 내에 데이터가 존재하면 delete[] _data; // 할당 해제 } 기본 생성자를 만..

CS/자료구조 2023.02.11