String 10

[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

[프로그래머스] 신규 아이디 with C++

문제 설명 제한 사항 및 입출력 예제 개념 주어진 문자열에 대해서, 문제에서 제시한 7단계의 규칙을 순차적으로 적용하여 새로운 문자열을 생성하는 문제다. 각 단게는 특정 문자열 패턴의 변환 및 제거를 포함하며, 모든 단계를 차례대로 완료하면 최종적으로 원하는 문자열 형태를 얻을 수 있다. 풀이 #include #include #include using namespace std; string solution(string new_id) { string answer = ""; // 1단계 transform(new_id.begin(), new_id.end(), new_id.begin(), static_cast(std::tolower)); // 2단계 new_id.erase(remove_if(new_id.begi..

[C++] 정규 표현식 with C++

regex 개요 정규 표현식(Regualar Expreesion)은 문자열을 검색하거나 대체하는 데 사용되는 패턴이다. 이 패턴은 고정된 문자열이 될 수도 있고, 복잡한 문자열 패턴을 설명하는 규칙이 될 수도 있다. 이러한 표현식은 다양한 프로그래밍 언어에서 사용되며, C++에서는 regex 라이브러리를 사용하여 정규 표현식을 처리할 수 있다. 정규 표현식은 다음과 같은 경우에 유용하다. 특정 패턴을 가진 문자열을 찾을 때 문자열을 분리하거나 대체할 때 데이터 유효성 검사 이번 시간에는 regex 라이브러리를 활용해서 문자열을 분석하고 조작하는 다양한 방법들에 대해 알아보자. 본문 먼저 정규 표현식에 나오는 문법들에 대해 간단하게 알아보자. 여기서는 일반적으로 사용되는 몇 가지 기본적인 문법에 대해서만 ..

Language/C++ 2023.08.06

[백준] 1013 Contact With C++

문제설명 입출력 예제 개념 주어진 문자열에서 특정 패턴을 찾는 문제다. C++에서 문자열에서 특정 패턴을 찾는 데 사용할 수 있는 주요 라이브러리로는 정규 표현식(Regex) 라이브러리 regex가 있다. 이는 문자열 검색 알고리즘이 사용할 수 있는 템플릿으로 작동한다. 이를 이용하여 문자열에서 특정 내용을 찾거나 대체하거나, 입력된 문자열이 특정 패턴과 일치하는지 확인하는 등의 작업을 수행할 수 있다. 정규 표현식의 구문 중 문제에서 제시하는 표현들은 다음과 같다. abc: 정확히 abc와 일치하는 문자열을 찾는다 a+: a가 1번 이상 반복되는 문자열을 찾는다 (ab)+: ab가 1번 이상 반복되는 문자열을 찾는다 a|b: a또는 b를 찾는다 이를 이용하여 정규 표현식 패턴을 나타내는 클래스인 reg..

Algorithm/백준 2023.08.01

[C++] 문자열 변환 - 대문자/소문자 변환

문자열 변환 개요 문자열을 대문자/소문자로 변환하는 것은 사용자의 입력을 정규화하거나, 문자열을 비교하기 위해 종종 사용된다. 사용자로부터 받은 입력은 대소문자가 섞여 있거나, 불규칙한 형태로 들어올 수 있다. 이렇게 다양한 형태로 들어온 데이터를 일관된 형식으로 변환하는 것을 정규화라고 하는데, 대문자나 소문자로 변환하는 것은 이런 정규화 작업의 일부로, 이를 통해 데이터를 일관되게 다룰 수 있게 된다. 또한 대소문자를 구분하지 않은 문자열 비교를 수행할 때, 모두 대문자나 소문자로 변환하여 비교하는 것은 편리한 작업이다. 예를 들어, 사용자 이름이나 이메일 주소를 비교할 때, 대소문자를 구분하지 않도록 모두 같은 형식으로 변환한 후에 비교를 수행하면 오류를 줄일 수 있다. 이번 시간에는 이러한 방법들..

Language/C++ 2023.07.31

[프로그래머스] 개인정보 수집 유효기간 with C++

문제 설명 제한 사항 및 입출력 예제 개념 개인정보의 수집 유효기간을 확인하는 문제다. 이 문제에서는 오늘 날짜와 각 개인정보의 수집일을 바탕으로 개인정보의 수집이 유효한지, 아니면 파기해야 하는지를 판단하게 된다. 이때, 날짜는 YYYY.MM.DD 형태로, 개인정보는 YYYY.MM.DD A 형태로 주어집니다. 각 개인정보에는 수집일과 개인정보 유형(A)이 포함되어 있다. 이 유형은 유효 기간을 결정한다. 예를 들어, A 유형의 개인정보는 수집일로부터 특정 기간 동안만 유효한다. 유효 기간은 'terms'라는 문자열 벡터에 정의되어 있으며, 각 문자열은 유형과 그 유형의 유효 기간을 나타내는 월 단위의 숫자로 구성되어 있다. 따라서 이 문제의 목표는 오늘 날짜를 기준으로 개인정보의 유효 기간이 지났는지를..

[프로그래머스] 영어 끝말잇기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 이 문제는 끝말잇기 게임의 참가자들 중에서 규칙을 어긴 첫 번째 참가자와 그 참가자의 턴을 식별하고 출력하는 것을 목표로 한다. 여기서 주요 과제는 두 가지다. 각 턴에서 주어진 단어가 이전 단어의 마지막 글자로 시작하는지 판별 각 턴에서 주어진 단어가 이전에 사용된 적 있는 단어인지 확인 첫 번째 규칙은 문자열의 마지막 문자와 첫 문자를 비교하는 방식으로 해결할 수 있고, 두 번째 규칙은 find() 함수를 이용하여 단어의 이력을 관리하는 데이터 구조를 검색함으로써 해결할 수 있다. 이 두 가지 체크를 통과하지 못하는 첫 번째 단어를 발견하면, 해당 단어를 말한 참가자의 번호와 차례를 리턴하게 하면 된다. 풀이 #include #include #include ..

[프로그래머스] JadenCase 문자열 만들기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 첫 문자를 대문자로 처리하고 나머지 알파벳을 소문자로 처리하는 문자열 처리 문제다. 입력 문자열에서 각 단어의 첫 문자를 대문자로, 그 외의 알파벳을 소문자로 바꾸는 작업이 필요하다. 여기서 '단어'는 공백 문자로 구분되므로, 문자열을 순회하며 공백 문자를 만났을 때 그 다음 문자를 대문자로 바꿔주면 된다. 풀이 #include #include using namespace std; string solution(string s) { string answer; bool isTrue = false; answer += toupper(s[0]); s = s.substr(1); 공백 문자를 만났는지 여부를 체크할 플래그 변수 isTrue를 false로 초기화해준다. 그리고..

[백준] 9935 문자열 폭발 with C++

문제설명 입출력 예제 개념 문제의 목표는 주어진 문자열에서 특정 '폭발' 문자열을 제외하고 출력하는 것이다. 이를 해결하기 위해 입력 문자열에서 특정 문자열을 식별하고 삭제하는 과정이 필요하다. 이러한 과정은 문자열을 찾는 작업에서 O(n)의 시간 복잡도와 특정 문자열을 삭제한 후 남은 요소들을 이동시키는 작업에서 O(n)의 시간 복잡도를 갖게 된다. 따라서 두 연산을 합치면 전체 알고리즘의 최악의 경우 시간 복잡도가 O(n^2)이 되므로, 큰 입력에 대해 비효율적이라는 결론을 내릴 수 있다. 이를 해결하는 가장 효과적인 방법은 스택을 사용하는 것이다. 폭발 문자열의 마지막 문자와 현재 입력받은 문자를 비교하여, 완전히 일치할 경우 해당 문자열을 제거하는 방식으로 진행하면 된다. 풀이(1) 스택 활용 #..

Algorithm/백준 2023.05.24