코테/항해99

[99클럽 코테 스터디 3일차 TIL] #문자열3

쪼성윤 2024. 10. 30. 23:53

어김없이 찾아온 코테 스터디 3일 차! 시작해 보도록 하자

 

문제 설명


문자열이 주어지면 문제의 규칙에 따라 첫 번째 문자열과 다음에 나오는 문자열을 비교하여 이에 대한 개수를 구하는 문제이다.

https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

생각 흐름


문제를 봤을 때, 주어진 규칙들이 너무 많아서 당황스러웠다. 하지만 천천히 읽어보기로 하였다.

 

막상 읽어보니 규칙은 세세하게 적혀있었지만 그 속에 말하고자 하는 알고리즘은 꽤나 단순해 보였다.

첫번째 문자와 다음부터 나오는 문자들을 비교해 이것들의 수를 비교하는 비교적 간단한 문제였다.

 

하지만 ㅋㅋ 막상 코드를 작성하니 머리가 멈추고 멍해지기 시작했던 것 같다.

 

문제에서 잘못 이해한 부분이 살짝 있었는데, 문자열의 첫번째 문자를 c로 고정하고 푸는 줄 알았지만 이게 아닌 문자열을 자라낼 때마다 첫번째 문자가 바뀌는 것이었다.

 

다음부터는 문제를 제대로 꼼꼼히 읽어야겠다는 생각을 하였다.

 

#include <string>
#include <iostream>
using namespace std;

int solution(string s) {
    int answer = 0;
    int c1 = 0, c2 = 0;
    char c = s[0];

    for (int i = 0; i < s.length(); i++) {

        if (s[i] == c) {
            c1++;
        }
        else {
            c2++;
        }

        if (c1 == c2) {
            answer++;
            c1 = 0; c2 = 0;
            c = s[i+1];
        }
    }

    if (c1 != 0) answer++;

    return answer;
}

int main () {
    string s;
    cin >> s;

    cout << solution(s);
}

 

 

공부한 내용 정리


이번 문제를 보면서 조건에 따라 문자열을 나눈다는 점에서 특정 문자가 나오면 끊어서 문자열을 저장하는 split() 함수를 떠올리게 되었습니다. C++에서는 이를 직접 구현해야 하기 때문에 이번 기회에 한번 더 공부하고 싶었습니다.

 

지금까지 공부한 find(), substr() 함수를 사용해서 구현해보고자 합니다.

 

split() 함수 구현하기!

 

 

find() 함수와 substr() 함수를 이용해 구현할 수 있습니다.

 

#include <bits/stdc++.h>
using namespace std;

vector <string> split(const string &input, string delimiter) {
    vector <string> result; // 각 문자열을 담은 vector 선언
    auto start = 0; // 처음 인덱스 start
    auto end = input.find(delimiter); // delimeter이 나오는 인덱스 반환 end
    while (end != string::npos) { // delimiter을 찾지 못할때까지
        result.push_back(input.substr(start, end - start));
        start = end + delimiter.size(); // delimiter위치와 delimiter 사이즈를 더해준다음 start 재정의
        end = input.find(delimiter, start); // 새로운 start 위치에서 delimiter 찾은 인덱스 값 end
    }

    result.push_back(input.substr(start)); // 나머지 부분 result에 넣기
    return result;
}

int main () {
    string str = "apple, banana, orange, grape";
    vector <string> fruits = split(str, ",");

    for (auto i : fruits) {
        cout << i << " ";
    }

    return 0;
}

 

출력: apple  banana  orange  grape