본문 바로가기
C#/C# : Baekjoon

[백준] C# : 크로아티아 알파벳(2941번)

by TODAYCODE 2021. 11. 11.
반응형

백준 단계별로 풀어보기 7단계 9번문제

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

문제의 핵심

1. 전체 문자에서 특정 단어만 모두 제거하는 방법

2. 제거된 단어가 총 몇개인지 파악하는 방법

3. Linq 문법 사용하기


 

언제나 그렇듯 지금 당장 할 수 있는 것부터 처리하고 막히는 부분을 고민하면 된다.

 

1.

우선, 크로아티아 알파벳에 대한 정보를 가지고 있어야 비교를 할 수 있으므로 해당 정보를 만들어준다.

나는 알파벳 배열을 생ㅅ어해서 하드코딩으로 8가지 기호를 입력해줬다.

 

2.

문자열을 비교해서 하나씩 찾아내는 것도 좋은 방법이지만, 이런 유형의 경우는 linq문법을 사용하면 훨씬 수월하다.

상단에 using System.Linq;를 적어준 뒤 Replace()를 사용했다.

Replace는 첫번째매개변수를 두번째 매개변수로 바꿔준다.

즉, 입력받은 문자열에 Replace(크로아티아알파벳, "")을 해주면 크로아티아에 해당하는 문자가 사라진다.

 

3.

문자를 없애는 건 둘째치고 몇개인지는 어떻게 알아낼까?

방법은 다음과 같다.

우선 2번의 방식대로 특정 문자를 전부 없애고 그 결과값인 문자열의 Length를 구한다.

= str.Replace(aa, "").Length;

여기서 얻어진 값을 원래 초기에 입력된 문자열의 Length에서 빼준다.

x = str.Length - str.Replace(aa, "").Length;

그럼 사라진 총 길이를 알 수 있는데 이걸 없애려고했던 특정 문자의 길이로 나눠준다.

 = x / aa.Length;

그러면 해당 단어가 총 몇개였는지를 알아낼 수 있다.

 

4.

3의 방법을 활용해서

입력된 문자열을 크로아티아배열길이만큼 for문을 돌려서

크로아티아 문자를 전부 제거하면서 제거한 숫자를 센다.

그리고 제거할 때마다 문자열의 해당 부분을 '_' 등으로 바꿔야한다.

(만약 그냥 없애버리게 되면 원래는 상관없는 문자끼리 만나게되면서 원래는 없던 크로아티아문자가 새로 생성될 수도 있기 때문에 이를 방지하기 위해서 아예 없애는게 아니라 _로 바꾸는 것이다)

 

5.

4의 과정을 거치게 되면,

크로아티아 문자에 해당되는 부분은 전부 _로 바뀌게 되고

크로아티아문자가 아닌 부분만 온전히 남아있게 된다.

이 상태에서는 _를 전부 없애더라도 오류가 발생하지 않기때문에

마지막으로 문자열에서 _를 모두 없애버린뒤에 남아있는 문자열의 길이를 더해준다.

그러면 최종적인 정답을 얻을 수 있다.

 

 

 

정답 코드

using System;
using System.Linq;

class 크로아티아_알파벳
{
    static string[] alpabet = new string[8]
    {
        "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="
    };

    static void Main()
    {
        string str = Console.ReadLine();
        Console.WriteLine(Count(str, alpabet));
    }

    static int Count(string str, string[] alpabet)
    {
        int answer = 0;
        int sum = 0;

        for (int i = 0; i < alpabet.Length; i++)
        {
            // 처음길이에서 - 타겟단어 전부 삭제 => 없어진 길이 획득 -> 이걸 단어 길이로 나누면 횟수 획득.
            sum = str.Length - str.Replace(alpabet[i], "").Length;
            str = str.Replace(alpabet[i], "_");
            answer += sum / alpabet[i].Length;
        }
        str = str.Replace("_", "");
        answer += str.Length;
        return answer;
    }
}
반응형

댓글