[Java] 백준 2941번: 크로아티아 알파뱃

hansung's·2024년 2월 20일
0

문제 url:
크로아티아 알파뱃

문제:

🤔 문제 파악하기

  • 해당 단어가 존재하면 하나의 글자로 본다.
  • 단어가 입력되면 한 단어씩 확인하면서 해당 단어와 일치하다면 공백 혹은 미지의 문자로 변경하여 해당 단어의 글자수를 확인하다.

😎 준비하기

1. BufferedReader를 이용해 입력받을 수 있도록 한다.
2. 단어를 입력받는다.
3. charAt() 메서드를 이용해서 한 글자씩 확인하는데,
↘
	여기서 C, dz, d, l, n, s, z로 시작하는 단어가 오게 되면 
    뒤의 단어까지 확인해서 변경해야할 단어가 맞다면 다른 단어로 변경한다.
    여기서 if문을 이용해서 진행해보고자 한다.
    
※ 다른 방법으로는 replace() 메서드를 이용해서 해당 단어가 존재하면 변경하도록 할 수 있다.

2가지 방법에 대해서 해당 문제를 풀어보도록 해보자

  • 단어를 입력받으면 charAt() 메서드를 이용해 한 단어씩 확인한 후 해당 단어를 유추
  • replace() 메서드를 이용해 해당 단어가 존재하면 변경

🐱‍👤 실제 코드 Ver.1 CharAt() 메서드 이용

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 0. 단어의 개수를 세기 위한 변수 정의
        int count = 0;

        // 1. 단어 입력받기
        String word = br.readLine();

        // 2. 단어의 길이만큼 반복
        for (int i = 0; i < word.length(); i++) {

            // 3. c= , c-가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 'c' && i < word.length()-1) { //해당 단어가 만약 c라면?
                if (word.charAt(i+1) == '=') {
                    i++;
                    count++;
                    continue;
                } else if (word.charAt(i+1) == '-') {
                    i++;
                    count++;
                    continue;
                }

            }

            // 4. dz=, d-가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 'd' && i < word.length()-1) { //해당 단어가 만약 d라면?
                if (word.charAt(i+1) == '-') {
                    i++;
                    count++;
                    continue;
                } else if (word.charAt(i+1) == 'z' && i < word.length()-2) {
                    if (word.charAt(i+2) == '=') {
                        i+=2;
                        count++;
                        continue;
                    }
                }
            }

            // 5. lj가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 'l' && i < word.length()-1) { //해당 단어가 만약 l라면?
                if (word.charAt(i+1) == 'j') {
                    i++;
                    count++;
                    continue;

                }
            }

            // 6. nj가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 'n' && i < word.length()-1) { //해당 단어가 만약 n라면?
                if (word.charAt(i+1) == 'j') {
                    i++;
                    count++;
                    continue;

                }
            }

            // 7. s=가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 's' && i < word.length()-1) { //해당 단어가 만약 s라면?
                if (word.charAt(i+1) == '=') {
                    i++;
                    count++;
                    continue;

                }
            }

            // 8. z=가 존재하는지 확인하기 위한 의문문
            if (word.charAt(i) == 'z' && i < word.length()-1) { //해당 단어가 만약 z라면?
                if (word.charAt(i+1) == '=') {
                    i++;
                    count++;
                    continue;

                }
            }

            count++;

        }

        System.out.println(count);
    }
}

이렇게 모든 경우의 수를 다 설정하여 구할 수 있다.
위 코드는 너무 더럽다.. 그래서 좀 더 간결하고 가독성 있게 하는 연습도 진행해야겠다.

👀 ver.1 트러블 슈팅

사진을 찍어놨는데.. 이게 왜 날라갔지

그렇다.. 한번에 되면 필자가 아니다.
위의 코드는 현재 제대로 된 코드라서 문제가 없지만
아마 && i < word.length()-1을 한 것들을 볼 수 있다.
왜 이렇게 해놨는지에 대해서 살펴보자.

먼저 해당 코드가 없이 진행하면 java.lang.StringIndexOutOfBoundsException
예외가 등장한다.
이를 해석하면 인덱스 참고 범위를 벗어났을 때 해당 예외가 발생한다.
(= 참조할 수 없는 범위라고 한다.)

참고한 블로그 글을 인용하면
만약 aedzdz=ls=c 이 단어를 입력받았다고 가정하면,

dz= | s= 이부분이 한 단어로 카운트가 되어야 한다.
그런 다음 마지막 자리 aedzdz=ls=c를 계산하게 되면

if (word.charAt(i) == 'c' ) { //해당 단어가 만약 c라면?
                if (word.charAt(i+1) == '=') {
                    i++;
                    count++;
                    continue;
                } else if (word.charAt(i+1) == '-') {
                    i++;
                    count++;
                    continue;
                }

            }

해당 코드가 작동하게 될 것인데, 이미 i는 마지막 인덱스 번호까지 온 시점에서
i+1은 인덱스 범위를 초과한 번호가 될 것이다. 그렇게 되면 이제 참조할 수 없는 인덱스로 예외가 발생하게 되는 것이다.

결론:
이러한 예외처리를 하기 위해 if문에 존재하는 해당 단어는 반드시 인덱스 범위안의 위치에 속할 때만 유효성을 검사할 수 있도록 && i < word.length()-1 코드를 넣으면 된다.

🐱‍👤 실제 코드 ver.2 replace() 메서드 이용


import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] c_word = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

        String word = br.readLine();

        for(String value : c_word) {
            word = word.replace(value, " ");
        }

        System.out.println(word.length());
    }
}

풀이:
변화해야 하는 단어를 배열로 초기화해준 다음,
입력 받은 단어에 replace()를 이용하여 " "(공백)으로 변경한 후
변경된 단어의 길이를 계산하면 쉽게 풀 수 있다.

replace에 대해 더 알아가고 싶다면 여길 클릭!

❤ 참고자료

[백준] 2941번: 크로아티아 알파뱃 - JAVA [자바] Stranger's LAB

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글