코드를 느껴바라

13022번 : 늑대와 올바른 단어 [C++] 본문

PS/백준(Baekjoon)

13022번 : 늑대와 올바른 단어 [C++]

feelTheCode 2026. 2. 2. 23:31

문제 링크

성공 여부(걸린 시간): 성공 (19분 12초)

아이디어

오랜만에 빡구현 문제를 풀다가 아직 C++ 문자열이나 여타 다른 문법에 미숙함을 깨닫고 기본에 충실하고자 풀어보았다.

문제의 요구사항은 다음과 같다.

단어가 주어졌을때 올바른 단어인지 아닌지 1, 0으로 출력하는 것이다.

올바르다의 기준은

  1. 임의의 양의 정수 n에 대해서, 'w'가 n번 나오고, 그 다음에 'o'가 n번, 그 다음에 'l'이 n번, 그 다음에 'f'가 n번 나온 단어는 올바른 단어이다.
  2. 올바른 단어 두 개를 이은 단어도 올바른 단어이다.
  3. 1번과 2번 조건으로 만들 수 있는 단어만 올바른 단어이다.

이 세가지인데

나는 우선 같은 알파벳이 연달아오면 해당 알파벳으로 압축시켜주었다.

그리고 압축시키는 과정에서 w가 아님에도 바로 전 압축전 길이와 현재 같았던 알파벳 연속의 길이가 다르면

틀린 단어이므로 0을 출력하고 종료를 해주었다.

만약 압축을 무사히 완료하고 압축된 문자열을 4씩 끊어서 wolf와 대조하고 만약 한번이라도 틀린 것이 나오면 0

그것이 아니고 제대로 종료되면 1을 출력하게 되도록 짰다.

풀이코드

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    string word;
    cin >> word;
    //simple 문자열에 중복된 알파벳의 압축 버전을 넣는다.
    string simple = "";
    int pre_len = 1;
    for (int i = 0; i < word.length(); ) {
        int same_len = 1;
        for (int j = i + 1; j < word.length(); j++) {
            if (word[i] != word[j]) {
                break;
            }
            else {
                same_len++;
            }
        }
        if (word[i]!='w' && pre_len != same_len) {
            cout << 0;
            return 0;
        }
        simple = simple + word[i];
        i += same_len;
        pre_len = same_len;
    }
    if (simple.length()%4!=0) {
        cout << 0;
        return 0;
    }
    else {
        for (int i = 0; i < simple.length(); i+=4) {
            if (simple.substr(i, 4) != "wolf") {
                cout << 0;
                return 0;
            }
        }
    }
    cout << 1;
    return 0;
}
반응형