[Java] 크로아티아 알파벳

정석·2024년 2월 11일

알고리즘 학습

목록 보기
11/67
post-thumbnail

문제


첫번째 풀이 (Error - StringIndexOutOfBounds)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        // 입력받은 단어
        String word = input.readLine();

        // 단어의 길이 저장
        int wordLength = word.length();
        int count = 0;

        for (int i = 0; i < wordLength; i++) {

            // 임시 저장할 알파벳 변수
            char charTemp = word.charAt(i);

            if (charTemp == 'c') {
                if (word.charAt(i + 1) == '=') {
                    i++;
                } else if (word.charAt(i + 1) == '-') {
                    i++;
                }
            }

            else if (charTemp == 'd') {
                if (word.charAt(i + 1) == '-') {
                    i++;
                } else if (word.charAt(i + 1) == 'z') {
                    if (word.charAt(i + 2) == '=') {
                        i += 2;
                    }
                }

            }

            else if (charTemp == 'l') {
                if (word.charAt(i + 1) == 'j') {
                    i++;
                }
            }

            else if (charTemp == 'n') {
                if (word.charAt(i + 1) == 'j') {
                    i++;
                }
            }

            else if (charTemp == 's') {
                if (word.charAt(i + 1) == '=') {
                    i++;
                }
            }

            else if (charTemp == 'z') {
                if (word.charAt(i + 1) == '=') {
                    i++;
                }
            }

            count++;
        }
        System.out.println(count);
    }
}
  • StringIndexOutOfBounds 에러가 발생했다. 만약 i 가 문자열의 마지막 인덱스라면 범위를 넘어가게 되기 때문이다. 따라서 문자열의 길이 - 1 을 한 값이 i 보다 크다면 로직이 수행되도록 수정했다.

두번째 풀이 (오답)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        // 입력받은 단어
        String word = input.readLine();

        // 단어의 길이 저장
        int wordLength = word.length();
        int count = 0;

        for (int i = 0; i < wordLength; i++) {

            // 임시 저장할 알파벳 변수
            char charTemp = word.charAt(i);

            if (charTemp == 'c') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    } else if (word.charAt(i + 1) == '-') {
                        i++;
                    }
                }
            }
            
			/** 틀린 부분 */
            else if (charTemp == 'd') {
                if (i < wordLength - 2) {
                    if (word.charAt(i + 1) == 'z') {
                        if (word.charAt(i + 2) == '=') {
                            i += 2;
                        }
                    }
                }
                
                else if (i < wordLength -1) {
                    if (word.charAt(i + 1) == '-') {
                        i++;
                    }
                }
            }

            else if (charTemp == 'l') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == 'j') {
                        i++;
                    }
                }
            }

            else if (charTemp == 'n') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == 'j') {
                        i++;
                    }
                }
            }

            else if (charTemp == 's') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    }
                }
            }

            else if (charTemp == 'z') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    }
                }
            }

            count++;
        }
        System.out.println(count);
    }
}
  • d에 대한 크로아티아 알파벳을 찾아낼 때 wordLength - 2 로직을 먼저 구현하였고 그 안에 wordLength - 1 부분을 추가하였다. 하지만 이 코드는 틀렸다. d 에 대한 알파벳을 찾아낼 때 d-2 를 먼저 구현하다보니 d-1 부분이 체크되지 않을 경우가 존재하기 때문이다.

  • d-1 을 먼저 구현하고 후에 d-2 를 체크하는 방식으로 바꿨다.

정답

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        // 입력받은 단어
        String word = input.readLine();

        // 단어의 길이 저장
        int wordLength = word.length();
        int count = 0;

        for (int i = 0; i < wordLength; i++) {

            // 임시 저장할 알파벳 변수
            char charTemp = word.charAt(i);

            if (charTemp == 'c') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    } else if (word.charAt(i + 1) == '-') {
                        i++;
                    }
                }

            } else if (charTemp == 'd') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == 'z') {
                        if (i < wordLength - 2) {
                            if (word.charAt(i + 2) == '=') {
                                i += 2;
                            }
                        }
                    } else if (word.charAt(i + 1) == '-') {
                        i++;
                    }

                }

            } else if (charTemp == 'l') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == 'j') {
                        i++;
                    }
                }

            } else if (charTemp == 'n') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == 'j') {
                        i++;
                    }
                }

            } else if (charTemp == 's') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    }
                }

            } else if (charTemp == 'z') {
                if (i < wordLength - 1) {
                    if (word.charAt(i + 1) == '=') {
                        i++;
                    }
                }
            }

            count++;
        }
        System.out.println(count);
    }
}

문제를 풀 때 if 문의 순서를 머릿속으로 대강 생각하지 않고 직접 구현해보며 하는 습관을 가져야 겠다.

0개의 댓글