코딩테스트/백준
[백준 JAVA] 2941 - 크로아티아 알파벳
kittae
2024. 11. 25. 15:14
생각보다 강적(?)인 문제였다.
먼저, 최대 100글자인 점에서, 시간제한과 메모리 제한은 문제가 없는 것으로 판단했다.
그래서 먼저 생각한 초기 큰 틀은 밑에와 같다.
/*
* 기본 카운 = 문자열 갯수
* 만약, 해당 문자열이 특정 문자열 -> 이중 if 문으로 맞다면 count-1
* legth + 1 값을 넘기지 않게 for문에서 s.length() - 1 로 자정
* */
나는 문제를 생각했는데 먼저 카운트 값을 글자수로 맞추고, 해당 단어가 있을 때, count--를 하는 것이였다!
슈슉 풀어보았다.
import java.io.*;
Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int count = s.length();
for (int i = 0; i < s.length()-1; i++) {
if (s.charAt(i) == 'c') {
if (s.charAt(i + 1) == '=' || s.charAt(i + 1) == '-') {
i++;
count--;
}
}
if (s.charAt(i) == 'd') {
if (s.charAt(i + 1) == '-') {
i++;
count--;
}
if (s.charAt(i + 1) == 'z' && s.charAt(i+2) == '=') {
i+=2;
count-=2;
}
}
if (s.charAt(i) == 'l') {
if (s.charAt(i + 1) == 'j') {
i++;
count--;
}
}
if (s.charAt(i) == 'n') {
if (s.charAt(i + 1) == 'j') {
i++;
count--;
}
}
if (s.charAt(i) == 's') {
if (s.charAt(i + 1) == '=') {
i++;
count--;
}
}
if (s.charAt(i) == 'z') {
if (s.charAt(i + 1) == '=') {
i++;
count--;
}
}
}
System.out.println(count);
}
}
예전에 푼 문제여서 쉽게 풀 수 있었다고 생각했는데, 자꾸 에러가 난 것이다.
1. 런타임 에러(StringIndexOutBounds)
if (s.charAt(i) == 'd') {
if (s.charAt(i + 1) == '-') {
i++;
count--;
}
if (s.charAt(i + 1) == 'z' && s.charAt(i+2) == '=') {
i+=2;
count-=2;
}
}
해당 오류의 원인은, 해당 단어가 'dz='일 때, 만약 i + 2를 했을 때 해당 인덱스를 벗어나 에러가 뜨는 것이였다.
또한, else를 하지 않으면 i가 증가된 상태에서 다음 z=를 또 하나의 문자로 인식하는 에러가 발생했다.
최종코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int count = s.length();
for (int i = 0; i < s.length()-1; i++) {
if (s.charAt(i) == 'c') {
if (s.charAt(i + 1) == '=' || s.charAt(i + 1) == '-') {
i++;
count--;
}
}
if (s.charAt(i) == 'd') {
if (s.charAt(i + 1) == '-') {
i++;
count--;
}
else if (i + 2 < s.length() && s.charAt(i + 1) == 'z' && s.charAt(i+2) == '=') {
i+=2;
count-=2;
}
}
if (s.charAt(i) == 'l') {
if (s.charAt(i + 1) == 'j') {
i++;
count--;
}
}
if (s.charAt(i) == 'n') {
if (s.charAt(i + 1) == 'j') {
i++;
count--;
}
}
if (s.charAt(i) == 's') {
if (s.charAt(i + 1) == '=') {
i++;
count--;
}
}
if (s.charAt(i) == 'z') {
if (s.charAt(i + 1) == '=') {
i++;
count--;
}
}
}
System.out.println(count);
}
}
배운점
반례를 잘 찾는 연습을 해야겠다.
런타임 에러를 대비하여 추후 코드를 작성핧 때 인지하고 작성해야겠다.