[Algorithm running]백준-크로아티아 알파벳

기 원·2025년 2월 19일

* 문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
čc=
ćc-
dz=
đd-
ljlj
njnj
šs=
žz=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

  1. 입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int i, count = 0;

        Scanner Scanner = new Scanner(System.in);
        String word = Scanner.nextLine();
		scanner.close();

        for (i = 0; i < word.length(); i++) {
            count++;

            if (word.charAt(i) == '=') {
                if (word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 's') {
                    count--;
                }
                if (word.charAt(i - 1) == 'z') {
                    count--;
                    if (word.charAt(i - 2) == 'd') {
                        count--;
                    }
                }
            }
            if (word.charAt(i) == '-') {
                if (word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 'd') {
                    count--;
                }
            }
            if (word.charAt(i) == 'j') {
                if (word.charAt(i - 1) == 'l' || word.charAt(i - 1) == 'n') {
                    count--;
                }
            }
        }

        System.out.println(count);
    }
}

String Index Out Of Bounds 오류 발생

이유 : 문자열의 인덱스를 초과해서 접근시 발생

  • 원인 1번
if (word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 's')

i - 1 부분에서 만약 i == 0일 경우 -1인덱스로 접근

  • 원인 2번
if (word.charAt(i - 2) == 'd')

i - 2 부분에서 i == 1이면 i - 2 == -1

해결 : i > 0 , i > 1을 추가


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int i, count = 0;

        Scanner Scanner = new Scanner(System.in);
        String word = Scanner.nextLine();


        for (i = 0; i < word.length(); i++) {
            count++;

            if (word.charAt(i) == '=') {
                if (i > 0 && word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 's') {
                    count--;
                }
                if (i > 0 && word.charAt(i - 1) == 'z') {
                    count--;
                    if (i > 1 && word.charAt(i - 2) == 'd') {
                        count--;
                    }
                }
            }
            if (word.charAt(i) == '-') {
                if (i > 0 && word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 'd') {
                    count--;
                }
            }
            if (word.charAt(i) == 'j') {
                if (i > 0 && word.charAt(i - 1) == 'l' || word.charAt(i - 1) == 'n') {
                    count--;
                }
            }
        }

        System.out.println(count);
    }
}

String Index Out Of Bounds 오류 발생

이유 : 문자열의 인덱스를 초과해서 접근시 발생

  • 원인
if (i > 0 && word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 's')

|| 연산자의 우선순위가 && 보다 낮기 때문에

(i > 0 && word.charAt(i - 1) == 'c') || word.charAt(i - 1) == 's'

위와 같이 해석

해결 : || 조건에 대해 () 처리로 우선순위 설정


정답

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int i, count = 0;

        Scanner Scanner = new Scanner(System.in);
        String word = Scanner.nextLine();


        for (i = 0; i < word.length(); i++) {
            count++;

            if (word.charAt(i) == '=') {
                if ((i > 0 && word.charAt(i - 1) == 'c') || (i > 0 && word.charAt(i - 1) == 's')) {
                    count--;
                }
                if (i > 0 && (word.charAt(i - 1) == 'z')) {
                    count--;
                    if (i > 1 && word.charAt(i - 2) == 'd') {
                        count--;
                    }
                }
            }
            if (word.charAt(i) == '-') {
                if ((i > 0 && word.charAt(i - 1) == 'c') || (i > 0 && word.charAt(i - 1) == 'd')) {
                    count--;
                }
            }
            if (word.charAt(i) == 'j') {
                if ((i > 0 && word.charAt(i - 1) == 'l') || (i > 0 && word.charAt(i - 1) == 'n')) {
                    count--;
                }
            }
        }

        System.out.println(count);
    }
}
profile
노력하고 있다니까요?

0개의 댓글