백준 2941

2018-11-07

백준 2941번 크로아티아 알파벳 찾기

img

img

정답

package baekjoon;
import java.util.Scanner;
public class Problem2941 {
    //크로아티아 알파벳 선언
    static String[] croatiaAlphabat = {"c=","c-","dz=","d-","lj","nj","s=","z="};
    public static void main(String[] args) {
        
 /* 주의 해야 될것 
  * 1. 크로아티아 알파벳 짜르고 붙이면 붙인 문자열이 또 다른 크로아티아 알파벳이 될 수 있음 ex) nljj
  * 2. c=c= 와 같은 두개의 동일한 크로아티아 알파벳 들어갔을 경우 처리해주기.
  */
        Scanner s = new Scanner(System.in);
        String test = s.nextLine();
        System.out.println(resultCroatiaAlphabat3(test));
    }
    
    static private int resultCroatiaAlphabat3(String test) {
        String[] testArray; // split된거 담을 변수
        String concatString = test; // 공백없는 문자열
        String inputString = test;// 비교당할 문자열 " "공백넣어줘서 구별
        int result = 0;
        
        for (String croatiaAlphabats : croatiaAlphabat) {
            if(inputString.contains(croatiaAlphabats)) {
                testArray = test.split(croatiaAlphabats);
                concatString = "";
                for (String string : testArray) {
                    concatString += string + " ";    
                }
                int resultLength = (test.length() - concatString.replaceAll(" ", "").length() ) / croatiaAlphabats.length();
                inputString = concatString;
                test = concatString.replaceAll(" ", "");
                result += resultLength;
            }
        }
        return concatString.replaceAll(" ", "").length() + result;
    }
    
}

접근방법.

  1. 문자열 비교 방법 ?

    확인된 문자는 짜르고 붙인다.

  2. 짜르는 방법은 ?

    해당된 문자열 부터 크로아티아알파벳 크기만큼 substring 해주기.

    해당된 크로아티아알파벳을 기준으로 split으로 배열로 나눠주기

    2가지 방법 중 선택

  3. 해당된 크로아티아 알파벳은 한번밖에 확인 못한다.

    중복적으로 나온 크로아티아 알파벳 처리하기.

생각해볼것.

  1. 크로아티아알파벳 배열 선언을 하여 8개의 크로아티아알파벳을 넣어주고,

    입력된 문자열을 비교했을때, 동일한 크로아티아알파벳이 연속될 경우 중복처리를 해줘야함.

    ex) c=c=

    split(“c=”) 하면 c=c= 가 전부사라짐. 그런 경우 크로아티아알파벳 2개존재유무 처리

int resultLength =
(test.length() - concatString.replaceAll(" ", "").length() ) / croatiaAlphabats.length();
  1. 문자열을 split 한후 concatString 변수에 붙여주면 원래는 없었던 크로아티아 문자가 생겨남

    ex) nljj 에서 lj을 제외 한후 붙이면 nj가 됨 nj도 크로아티아알파벳이므로 2를 출력하게된다 (정답은 3이다.)

img

여기서 lj 를 빼면

img

nj가 된다. 그런데 nj는 크로아티알파벳이므로 크로아티알파벳으로 인식되어서

결과 값이 2로 나온다.

img

split해준 배열을 이어줄때는 + “ “; 로 공백을 하나씩 줘서 방지해주자.

구분을 하기위해서 비교당할 변수인 conactString에 split 한 자리를 공백을 주고 이어붙인다.

for (String string : testArray) {
    concatString += string + " ";    
}

중복처리는?

크로아티아알파벳 8개를 배열로 담아서 한개씩 돌렸다.

하지만 한번 검사된 크로아티알파벳은 또 다시 검사하지 않는다.

split(“크로아티아알파벳”) 으로 포함된 크로아티아알파벳 전부다 제외시켜주고

concatString 변수에 넣어준다.

그런다음 ( split 하기전 String의 길이 - split 한 후 String 의 길이 ) / 크로아티아알파벳의 크기

를 해주면 중복처리까지 해줄 수 있다.

ex) ac=c=a 에서 c=c= 를 빼보자. (6-2)/2 = 2 이므로 총 2개의 크로아티아알파벳.

주의할점은 우리가 위에서 다시 이어붙여줄때 공백을 줬으므로 공백을 전부 제외해서 비교를 해줘야한다.