본문 바로가기
백준 문제 풀이/심화 1

(#2941 Java) 크로아티아 알파벳

by _비니_ 2024. 2. 21.

 

문제 해결

 

이 문제에서 잡고 가야하는 포인트는 크로아티아 알파벳 조건에 의해 하나의 문자로 세어진다는 점이다.

배열로 해결할 때, 인덱스의 범위가 벗어나지 않게 주의하며 문제를 풀어보자.

 

먼저 첫째 줄에 최대 100글자의 단어가 주어진다고 했으므로 입력받은 값을 저장해줄 문자열 변수 str을 만들어주자.

또한 출력되어야 하는 값은 문자를 센 값이다. 즉 count 변수를 만들어주자.

 

String str = in.nextLine();
int count = 0;

 

 

그리고 문자열의 길이만큼 반복해줄 반복문을 만들어준 후 그 안에 알맞은 조건문을 작성해주자.

예제 입력에서 lj는 1개의 단어로 세어져야 한다. 그럼 어떻게 코드를 작성해야 할까?

 

for ( int i = 0; i < str.length; i++) {

	char ch = str.charAt(i);
    
    if(ch == "l") { //ch가 l일 경우,
    	if(str.charAt(i+1) == 'j' { //ch가 l이고, 그 다음 글자(i+1)가 j라면
        	i++; //i를 하나 증가시킴. (하나의 글자로 세기 위함)
        }
    }
    
    count ++; //그냥 l이면 count를 하나 증가시킴.
}

 

위와 같이 작성하면 된다!!! 

 

그럼 위와 같은 원리로 다른 크로아티아 언어들도 작성해보자!!!!

 

for (int i = 0; i < str.length; i++) {
 
	char ch = str.charAt(i);
 
	if(ch == 'c') {		
		if(str.charAt(i + 1) == '=') {// c= 일 경우
            i++;		
		}
		else if(str.charAt(i + 1) == '-') {// c- 일 경우
			i++;
		}
	}
    
	else if(ch == 'd') {
		if(str.charAt(i + 1) == 'z') {
			if(str.charAt(i + 2) == '=') {// dz= 일 경우
			 // dz= 일 경우는 3개의 문자가 하나로 취급되므로 2를 증가시켜줌
             i += 2;
			}
		}
        
		else if(str.charAt(i + 1) == '-') {// d- 일 경우
			i++;
		}
	}
    
	else if(ch == 'l') {
		if(str.charAt(i + 1) == 'j') {// lj 일 경우
			i++;
		}
	}
    
	else if(ch == 'n') {
		if(str.charAt(i + 1) == 'j') {// nj 일 경우
			i++;
		}
	}
 
	else if(ch == 's') {
		if(str.charAt(i + 1) == '=') {// s= 일 경우
			i++;
		}
    }
 
	else if(ch == 'z') {
		if(str.charAt(i + 1) == '=') {// z= 일 경우
			i++;
		}
	}
    
	count++;
 
}

 

 

근데 여기에서 문제가 하나 있다.

문제 해결 초반에서 언급했던 인덱스 참조 범위 초과 문제이다.

 

만약 문자 l이 맨 마지막에 위치하고 있을 경우, l 이후에 j가 나오는지를 확인하기 위한 조건문이 실행된다.

하지만 다음 문자는 존재하지 않기 때문에, charAt() 을 통해 참조하려할 때 'StringIndexOutOfBoundsException' 를 발생시킨다.

 

이를 해결하기 위해서는 i 값이 str의 길이보다 n개의 문자를 하나로 취급 경우 n-1 보다 작은 경우에만 조건문을 실행시켜야햔다. (dz=는 i가 str.length -2일 경우 조건문 실행, 나머지는 -1일 경우 실행)

 

 

최종 코드

 

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
    
		Scanner in = new Scanner(System.in);
        
		String str = in.nextLine();
        
		int count = 0;
 
		for (int i = 0; i < str.length(); i++) {
 
			char ch = str.charAt(i);
 
			if(ch == 'c') {	 //ch가 c일 경우,
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == '=') { //ch가 c이고, 그 다음 글자(i+1)가 = 라면
						i++; //i를 하나 증가시킴. (하나의 글자로 세기 위함)		
					}
					else if(str.charAt(i + 1) == '-') {
						i++;
					}
				}
			}
		    
			else if(ch == 'd') {
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == 'z') {
						if(i < str.length() - 2) {
							if(str.charAt(i + 2) == '=') {	// dz= 일 경우
								i += 2;
							}
						}
					}
		        
					else if(str.charAt(i + 1) == '-') {	// d- 일 경우
						i++;
					}
				}
			}
		    
			else if(ch == 'l') {
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == 'j') {	// lj 일 경우
						i++;
					}
				}
			}
		    
			else if(ch == 'n') {
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == 'j') {	// nj 일 경우
						i++;
					}
				}
			}
 
			else if(ch == 's') {
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == '=') {	// s= 일 경우
						i++;
					}
				}
		    }
 
			else if(ch == 'z') {
				if(i < str.length() - 1) {
					if(str.charAt(i + 1) == '=') {	// z= 일 경우
						i++;
					}
				}
			}
		    
			count++; //조건에 해당하지 않으면 count를 하나로 취급.
 
		}
 
		System.out.println(count);
	}
}
반응형

'백준 문제 풀이 > 심화 1' 카테고리의 다른 글

(#25206 Java) 너의 평점은  (0) 2024.02.23
(#1316 Java) 그룹 단어 체커  (0) 2024.02.21