백준/백준 단계별 문제풀이

백준 2941번 (C++)

FDEE 2020. 8. 23. 10:28

www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s=

www.acmicpc.net

 

<답안>

#include <iostream>

using namespace std;

int main() {

    string input;

    string temp;

    int count = 0;

    int i = 0;

    cin>>input;

    

    while(i<input.size())

    {

        if(i<input.size()-1) {

            temp = input.substr(i,2);

            if (temp == "c=") {

                count++;

                i+=2;

            } else if (temp == "c-") {

                count++;

                i+=2;

            } else if (temp == "d-") {

                count++;

                i+=2;

            } else if (temp == "lj") {

                count++;

                i+=2;

            } else if (temp == "nj") {

                count++;

                i+=2;

            } else if (temp == "s=") {

                count++;

                i+=2;

            } else if (temp == "z=") {

                count++;

                i+=2;

            } else if (i == input.size()-2) {

                count+=2;

                i+=2;

            } else {

                if (i < input.size()-2) {

                    temp = input.substr(i,3);

                    if (temp == "dz=") {

                        count++;

                        i+=3;

                    }

                    else {

                        count++;

                        i++;

                    }

                }

            }

        }

        else {

            count++;

            i++;

        }

        

    }

    

    cout<<count;

    

    return 0;

}

 

<설명>

일단 내가원하는 깔끔한 느낌의 코드는 아닌듯해서 더 좋은 코드가 있을꺼 같다

 

string 형태로 문장을 input에 입력받는다

for 대신하여 while을 통해 비교글자 인덱스인 i값을 통해 i가 size() 보다 작을경우만 반복하도록 설정한다

이유는, "c=" 등 2글자 비교시 맞는경우 i를 2 증가시키는 경우도 있고, "dz=" 비교시 맞는경우 i를 3 증가시키는 경우도 있기 때문에

하나씩 증가시키는 for 대신하여 while을 사용하였다

 

while 반복시 인덱스 i를 size()-1 까지 허용한 이유는 마지막 글자 하나만 남은경우도 비교가 필요하기 때문에 size()-1까지 비교를 해야한다

다만, "c="을 비롯한 크기가2인 문장비교시 다음글자를 비교하려는 순간 범위를 벗어나는 에러가 발생한다

따라서 while은 i=0 ~ size()-1 까지 해당되지만 i값이 size()-2 이전에(i < size()-1) 해당되는 경우에만 뒷글자를 확인가능하도록 설계한다

 

i < size()-1 경우, 즉 뒷글자를 비교할 수 있는 경우와 마지막 글자인 i = size()-1 인 경우로 나뉜다

1. i < size()-1 경우 (뒤에 두글자 이상)

   인덱스 i부터 뒷글자까지 따와서 크기가 2인 string을 temp에 저장한다 : temp = input.substr(i,2);

   크기가 2인 각 크로아티아 알파벳과 비교하여 맞는경우 count는 1 증가, i는 2 증가 시키도록 한다

 

   만약 크기2인 크로아티아 알파벳과 일치하지 않는 경우는

   1. 3글자 크로아티아 알파벳인 경우

   2. 그냥 알파벳인 경우이며, 이또한 i값이 마지막글자 - 1인 경우(size()-2), 그 외의 경우로 나눠진다

 

   따라서 첫째로 크기2인 크로아티아 알파엣이 아닌 경우 중 i 값이 size()-2 인 경우는 마지막 두글자가 그냥 알파벳 이므로

   count를 2 증가시키고, i를 2 증가시킨다

 

   그 외의 경우는 뒷글자가 3개이상 남은 경우이므로 크기가3인 string을 temp에 저장하여 : temp = input.substr(i,3);

      크기3 크로아티아 알파벳인 "dz="과 비교를 한다

      같은 경우 count를 1 증가시키고 i를 3 증가시킨다

      그 외의 경우는 뒷글자가 3개 이상 남았으면서 i번째 문자가 그냥 알파벳인 경우이므로

      count를 1 증가, i를 1 증가시켜 다음글자로 넘긴다

 

2. i = size()-1 경우 (마지막 글자)

   마지막 글자이므로 무조건 그냥 알파벳이다

   따라서 count를 1 증가, i를 1증가시킨다

 

최종적으로 구해진 count를 출력한다

 

'백준 > 백준 단계별 문제풀이' 카테고리의 다른 글

백준 1712번 (C++)  (0) 2020.08.23
백준 1316번 (C++)  (0) 2020.08.23
백준 5622번 (C++)  (0) 2020.08.22
백준 2908번 (C++)  (0) 2020.08.22
백준 1152번 (C++)  (0) 2020.08.22