백준 - 2941번 크로아티아 알파벳(문자열, 구현, 정규표현식)

Kiwoong Park·2023년 5월 18일
0

문제

입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

C++ 풀이

C/C++ 에서 문자열을 다룰 때 유용하게 활용하는 데이터 구조나 함수들을 잘 몰라서 무지성 stirng 배열로 받고 조건문을 통해 모든 문자를 확인하면서 코드를 짜니 구현은 되고 잘 돌아가긴 했지만 이게 맞는 방식이었을까..?

#include <iostream>
using namespace std;

int main()
{
    int c,cnt=0;
    string str;
    cin >> str; // string 자료형으로 입력 받기
    for(int i=0;i<str.length();i+=c){ //처음 인덱스부터 순회하나 c를 더한 값을 기준으로 순회
        c=1;  // 아래의 if문들을 통해 크로이티아 알파벳이 없는 경우 한칸 다음 문자를 찾자
        if (str[i]=='c') {
            if (str[i+1]=='=' || str[i+1]=='-'){
                cnt++;
                c=2;
                continue; // 문자를 찾은 경우 다음 문자를 찾으러 이동
            }
        }
        
        if (str[i]=='d') {
            if (str[i+1]=='-'){
                cnt++;
                c=2;
                continue;
            }
            if (str[i+1]=='z' && str[i+2]=='='){
                cnt++;
                c=3;
                continue;
            }
        }
        
        if (str[i]=='l' && str[i+1]=='j'){
            cnt++;
            c=2;
            continue;
        }
        
        if (str[i]=='n' && str[i+1]=='j'){
            cnt++;
            c=2;
            continue;
        }
        
        if (((str[i]=='s' || str[i]=='z') && str[i+1]=='=')){
            cnt++;
            c=2;
            continue;
        }
        
        cnt++; // 모든 if문에 안 걸린 경우 그냥 알파벳이므로 한 개 추가
        
    }
    cout << cnt;
}

C++ 숏코딩 분석하기

난 1000바이트가 넘어가는데 겨우 137바이트라니.. 오늘도 배울게 많아 즐거운 하루

#import<bits/stdc++.h>
using namespace std;
main(){
	string s;
    cin>>s;
    regex r("[csz]=|[cd]-|[ln]j|dz=");
    cout<<regex_replace(s,r,"_").size();
}

regex..?

regex는 Regular Expressions(정규표현식)의 줄임말로 C++ referencewiki에서 자세한 내용을 확인할 수 있다.

정규표현식은 텍스트에서 일치 패턴(match pattern)을 지정하는 일련의 문자들(sequence of character)이다.

일반적으로 이러한 패턴은 문자열에 대한 'find' 또는 'find and replace' 작업이나 입력 유효성 검사를 위한 문자열 검색 알고리즘에 사용된다.

regex r("[csz]=|[cd]-|[ln]j|dz=");
// [] : bracket exression 으로 c,s or z다음에 오는 '='
// | : 또는 

regex_replace(s,r,"_") 
// 최초 입력 string s에 정규표현식 r의 패턴에 맞는 문자열을 찾아 "_"로 변환한다. 즉 다른 알파벳이랑 중복되지 않는 하나의 문자로 변환 한 것!
// string.size()를 하여 전체 문자 수 반환

profile
You matter, never give up

0개의 댓글