
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
| 크로아티아 알파벳 | 변경 |
|---|---|
| č | c= |
| ć | c- |
| dž | dz= |
| đ | d- |
| lj | lj |
| nj | nj |
| š | s= |
| ž | z= |
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
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);
}
}
이유 : 문자열의 인덱스를 초과해서 접근시 발생
if (word.charAt(i - 1) == 'c' || word.charAt(i - 1) == 's')
i - 1 부분에서 만약 i == 0일 경우 -1인덱스로 접근
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);
}
}
이유 : 문자열의 인덱스를 초과해서 접근시 발생
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);
}
}