C++ 137

[C++] std::binary_search

이진 탐색 개요 예전 이진 탐색에 대한 개념적인 부분을 해당 글에서 다룬 적이 있었다. 다시 상기하자면, 정렬된 배열을 반으로 나눠가며 원하는 값을 찾는 알고리즘이 이진 탐색이다. 이번 시간에는 해당 알고리즘을 구현한 std::binary_search 함수에 대한 사용법을 알아보도록 하자. 본문 사용법 이진 탐색 또한 탐색의 일종이므로, 배열 내에서 특정 요소가 존재하는지 확인할 때 사용된다. 이때 대상 범위가 이미 정렬되어 있어야 하며, 중복 요소가 있는 경우 어느 요소인지 알 수 없다. 이는 함수가 단순히 주어진 값이 배열 내에 존재하는지 여부만을 체크하기 때문이다. #include #include #include int main() { std::vector v = { 1, 2, 4, 5, 9, 10..

Language/C++ 2024.03.11

[백준] 2217 로프 with C++

문제설명 입출력 예제 개념 각 로프는 고유한 중량 한계를 가지고 있으며 이를 초과할 수 없다. 이때 로프 2개가 각각 10kg, 15kg을 버틸 수 있다고 하면, 10kg 한 개를 쓸 땐 10kg, 15kg 한 개를 쓸 땐 15kg, 10kg과 15kg을 함께 쓰면 각 로프가 10kg씩 버틸 수 있으므로 20kg를 버틸 수 있다. 이러한 특징에 착안하여 로프들을 강도에 따라 정렬하여 가장 강한 로프부터 시작하여 점점 약한 로프를 추가하며, 각 단계에서의 최대 중량을 계산할 수 있다. 이때 로프들 중 일부만을 선택해야 할 경우도 고려해야 한다. 예를 들어, 10, 20, 30, 40, 50kg을 버틸 수 있는 로프 5개가 있다고 가정해 보자. 1. 50kg: 50kg 2. 50kg, 40kg: 40 + 4..

Algorithm/백준 2024.03.08

[C++] 중복 처리 (2)

본문 중복 인덱스 처리 #include #include #include #include int main() { unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::mt19937 generator(seed); std::vector word_pairs = { {"game", "게임"}, {"start", "시작하다"}, {"smart", "똑똑한"}, {"string", "문자열"}, {"combination", "조합"}, {"pair", "쌍"} }; 다음과 같이 벡터에 단어와 그 정의가 저장되어 있고, 여기서 무작위로 5개의 문제를 낸다고 해보자. 이때 중복된 문제가 없으려면 어떻게 해야 할까? std::sh..

Language/C++ 2023.09.08

[C++] 중복 처리 (1)

중복 처리 개요 지난번에 업로드된 게시글에서는 다양한 난수 생성 방법들을 알아보았다. 이러한 난수를 활용하여 시스템을 설계하게 되면, 중복 문제가 불가피하게 발생할 수 있다. 특히 무작위로 고유한 값을 생성하거나 선택하는 과정에서 중복은 예기치 않은 오류를 발생시킬 수 있다. 따라서 중복 처리는 이러한 시스템에서 필수적인 단계가 되어야 한다. 이번에는 난수 생성 시 발생하는 중복 문제와 그를 효과적으로 해결하는 방안들에 대해 살펴볼 예정이다. 특히, 중복된 값 자체의 처리와 중복 인덱스 처리, 이 두 가지 주제에 초점을 맞추어 알아보도록 하겠다. 본문 중복 제거 std::vector v = { 7, 7, 1, 2, 3, 5, 5, 2, 8 }; 다음과 같이 vector 배열에 중복된 값이 있다고 가정해 ..

Language/C++ 2023.09.07

[Dictionary] 영어 단어 시험지 ver 1.1 (코드 리뷰) with Notion

영어 단어 시험지 코드 리뷰 본문 구성 ver 1.1 기준으로 해당 프로그램은 다음과 같이 API를 호출하는 부분(get_api.h/get_api.cpp), JSON 파일을 파싱해 단어를 저장하는 부분(get_vocabulary.h/get_vocabulary.cpp), 시험을 출력하는 부분(test.h/test.cpp), 메인 함수(main.cpp)로 구성되어 있다. 즉, 프로그램을 실행하면 Notion의 API를 호출하여 데이터베이스와 연결하고, 단어들을 JSON 구조로 추출하여 DOS 창에서 단어가 나오면 정답을 입력하게 되어 있다. 자세한 코드는 해당 리포지토리를 확인하면 된다. API 호출 저번 게시글에서도 언급했듯이, C++에서 Notion API를 호출하는 것은 번거로운 작업이다. 그래서 sy..

Project/Dictionary 2023.09.06

[C++] 난수 생성

랜덤 함수 개요 컴퓨터는 명령어와 알고리즘을 기반으로 동작하는 결정론적인 기계다. 이런 특성 때문에, 컴퓨터는 완전히 무작위적인 값을 자체적으로 생성하는 것이 기본적으로 어렵다. 그렇지만, 멀티코어 컴퓨터의 경우 각 코어 간의 타이밍 차이나 상호 작용으로 인한 비결정성을 활용하여 어느 정도의 무작위성을 가진 값을 생성할 수 있다. 그렇지만 이렇게 생성된 값은 완전한 엔트로피를 기반으로 하는 '진정한' 난수에 비해 일정한 제한이 있을 수 있다. C++에서는 여러 방법으로 이러한 무작위 값을 생성할 수 있다. 대표적인 방법으로는 C-style의 rand() 함수, C++11 이후에 도입된 라이브러리, 그리고 하드웨어 기반의 난수 생성기를 사용하는 std::random_device 클래스 등이 있다. 이 글에..

Language/C++ 2023.09.04

[C++] JSON 파일 읽기 with nlohmann

JSON 파일 읽기 개요 JSON(JavaScript Object Notation) 파일은 키와 값의 쌍으로 이루어진 파일이다. 이는 데이터베이스에서 데이터를 저장하고, 데이터를 주고받을 때 자주 사용되는 형식이다. 클라이언트가 사용하는 언어에 관계없이 통일된 데이터를 주고받을 수 있게 해 준다. 일반적인 JSON 파일의 구조는 다음과 같다. { "이름": "홍길동", "나이": 25, "주소": { "도시": "서울", "우편번호": "12345" }, "취미": ["독서", "여행", "요리"], "기혼": false } 위의 예시에서 이름, 나이, 주소, 취미, 기혼은 key고, 홍길동, 25, 도시, 우편번호, 독서, 여행, 요리, false는 각각의 값이다. 이때 값으로 객체와 배열을 포함할 수..

Language/C++ 2023.08.30

[Dictionary] 영어 단어 시험지 ver 1.0 with Notion

영어 단어 테스트 프로그램 개요 개발자들은 영어로 된 자료를 접할 일이 많다. 이는 프로그래밍의 역사가 미국에서 시작되었기 때문이고, 영어가 국제적인 커뮤니케이션 언어로 널리 사용되기 때문이다. 이런 배경 하에 필자는 영어로 된 기술 자료를 읽을 때마다 알게 된 새로운 단어나 표현들을 Notion에 기록해왔다. 그러나, 그저 단어를 기록하는 것만으로는 기억에 오래 남기에는 부족하다고 느껴졌다. 이 단어들을 효과적으로 외우고 활용하기 위해서는 반복적인 연습이 필요하다. 이런 고민에서 출발하여, 필자는 이 단어들을 테스트할 수 있는 간단한 프로그램을 개발하게 되었다. 본문 기본 아이디어 API 호출 → 단어 저장 → 단어 시험 → 결과 출력 노션은 사용자가 직접 데이터베이스를 구축할 수 있는 기능을 제공하며..

Project/Dictionary 2023.08.29

[C++] 문자열 처리 - 연속된 문자열과 동일한 문자열 (2)

동일한 문자열 동일한 문자열은 특정 문자나 문자열 패턴이 반복되는 것을 의미한다. 이를 식별하는 함수를 문자열 순회를 이용하는 방법, regex 라이브러리를 이용하는 방법을 통해 구현해 보자. 문자열 순회 #include #include bool IsRepeated(const std::string& str) { for (int i = 1; i < str.length(); ++i) { if (str[i] == str[i + 1]) return true; } return false; } int main() { std::string str; std::getline(std::cin, str); if (IsRepeated(str)) std::cout

Language/C++ 2023.08.26

[C++] 문자열 처리 - 연속된 문자열과 동일한 문자열 (1)

문자열 처리 개요 연속된 문자열과 동일한 문자열을 처리하는 것은 다양한 문제 해결에 필수적인 요소 중 하나다. 문자열 내에서 동일하거나 연속적인 문자나 패턴을 식별하고 처리하는 능력은 데이터 압축, 정보 검색, 보안 강화 등 여러 분야에서 중요한 역할을 한다. 특히, 연속된 문자열은 예측이 쉬우므로 보안 문제에서 취약점으로 작용할 수 있으며, 반면에 동일한 문자열은 데이터의 중복을 나타내므로 압축 알고리즘에서 핵심 요소로 작용한다. 이러한 문자열 처리 기법은 컴퓨터 과학과 프로그래밍의 여러 분야에서 활용되며, 효율적인 알고리즘과 메서드를 통해 더 나은 성능과 결과를 얻을 수 있다. 이번 시간에는 이러한 문자열을 처리하는 방법에 대해 알아보도록 하자. 본문 연속된 문자열 연속된 문자열은 abc, 123처럼..

Language/C++ 2023.08.25