문제 url:
크로아티아 알파뱃
문제:
1. BufferedReader를 이용해 입력받을 수 있도록 한다.
2. 단어를 입력받는다.
3. charAt() 메서드를 이용해서 한 글자씩 확인하는데,
↘
여기서 C, dz, d, l, n, s, z로 시작하는 단어가 오게 되면
뒤의 단어까지 확인해서 변경해야할 단어가 맞다면 다른 단어로 변경한다.
여기서 if문을 이용해서 진행해보고자 한다.
※ 다른 방법으로는 replace() 메서드를 이용해서 해당 단어가 존재하면 변경하도록 할 수 있다.
2가지 방법에 대해서 해당 문제를 풀어보도록 해보자
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);
}
}
이렇게 모든 경우의 수를 다 설정하여 구할 수 있다.
위 코드는 너무 더럽다.. 그래서 좀 더 간결하고 가독성 있게 하는 연습도 진행해야겠다.
사진을 찍어놨는데.. 이게 왜 날라갔지
그렇다.. 한번에 되면 필자가 아니다.
위의 코드는 현재 제대로 된 코드라서 문제가 없지만
아마 && 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 코드를 넣으면 된다.
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()를 이용하여 " "(공백)으로 변경한 후
변경된 단어의 길이를 계산하면 쉽게 풀 수 있다.