문제
https://www.acmicpc.net/problem/2941
2941번: 크로아티아 알파벳
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=
www.acmicpc.net
문제 풀이
처음 문제를 봤을 때 어떤 풀이 방법으로 해결해야 하나 싶어 지레 겁을 먹었지만 이 문제 풀이는 별다른 방법보다 그냥 하면 되는 것 같다. 8개의 조건 뿐이라 각각 if문 작성하는 것이 어려운 일은 아니었다.
1. 문자열을 입력받고 split 함수로 문자열 배열을 만든다.
2. 문자열 배열의 인덱스 하나씩 접근하여 크로아티아 알파벳의 조건에 부합하는지 하나씩 비교해 검사한다. 연달아 나온 문자까지 검사 후 크로아티아 알파벳이면 cnt 값을 1만큼 증가시키고, 인덱스 i 또한 연달아 나온 문자 개수 (이 문제에선 1 아니면 2) 를 더해준다.
3. 필자가 놓친 부분은 여기다. 해당 문자가 c인지, d인지 확인하는 부분에서 if문의 조건을 단일 조건으로 작성했다. 그리고 연달아 나오는 문자를 검사하는 if문 안에서 cnt 값을 증가하게 작성했었다. 이렇게 되면 c, d가 단독으로 나왔을 때 카운팅이 안 된 채로 넘어간다. 따라서 단독일 때도 카운팅 되도록 중첩 if문 바깥에 작성했다.
4. vsc에서 실행했을 때는 잘 되어 코드 제출을 했는데 런타임 에러(ArrayIndexOutOfBounds)가 발생했다. C와 달리 Java는 배열의 인덱스가 배열의 크기를 넘어가거나 음수인 경우에 대한 요청이 있을 경우 해당 예외를 발생시킨다. 이 예외는 컴파일러가 검사하지 않고 실행도중(런타임)에 검사해 예외를 발생시킨다.
5. i에 대한 조건으로 for문을 작성했는데 그 속에서 i+1, i+2을 검사하게 되면 i가 s.length-1 (마지막 인덱스)일 때 i+1, i+2에 대한 인덱스는 존재하지 않아 여기서 런타임 에러가 발생한다. 따라서 if문 조건으로 i가 s.length-2 (마지막 인덱스-1), s-length-3 (마지막 인덱스-2) 일 때만 작동하도록 추가했다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class boj_2941 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String[] s = str.split("");
int cnt = 0;
for (int i=0; i<s.length; i++) {
if (s[i].equals("c") && i<s.length-1) { // ArrayIndexOutOfBounds 런타임 에러 주의
if (s[i+1].equals("=") || s[i+1].equals("-")) {
i++;
}
cnt++; // c 단독일 때도 카운팅 되어야 함(중첩 if문 밖에 있어야 함. 위치 주의)
} else if (s[i].equals("d") && i<s.length-1) {
if (s[i+1].equals("-")) {
i++;
} else if (i<s.length-2 && (s[i+1].equals("z")) && s[i+2].equals("=")) {
i += 2;
}
cnt++; // d 단독일 때도 카운팅 되어야 함(중첩 if문 밖에 있어야 함. 위치 주의)
} else if (i<s.length-1 && s[i].equals("l") && s[i+1].equals("j")) {
i++;
cnt++;
} else if (i<s.length-1 && s[i].equals("n") && s[i+1].equals("j")) {
i++;
cnt++;
} else if (i<s.length-1 && s[i].equals("s") && s[i+1].equals("=")) {
i++;
cnt++;
} else if (i<s.length-1 && s[i].equals("z") && s[i+1].equals("=")) {
i++;
cnt++;
} else {
cnt++;
}
}
System.out.println(cnt);
}
}
'Algorithm > BaekJoon' 카테고리의 다른 글
[백준] 1193: 분수찾기 (0) | 2023.02.10 |
---|---|
[백준] 2292: 벌집 (0) | 2023.02.10 |
[백준] 1157: 단어 공부 (0) | 2023.02.08 |
[백준] 10973: 이전 순열 (자바/Java) (0) | 2022.11.02 |
[백준] 10972: 다음 순열 (자바/Java) (0) | 2022.11.02 |