백준 단계별로 풀어보기 7단계 9번문제
문제의 핵심
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;
}
}
'C# > C# : Baekjoon' 카테고리의 다른 글
[백준] C# : 그룹 단어 체커(1316번) (0) | 2021.11.12 |
---|---|
[백준] C# : 다이얼(5622번) (0) | 2021.11.10 |
[백준] C# : 상수(2908번) (0) | 2021.11.09 |
[백준] C# : 단어의 개수(1152번) (0) | 2021.11.08 |
[백준] C# : 단어 공부(1157번) (0) | 2021.11.07 |
댓글