크로아티아 알파벳

곽지욱·2023년 9월 6일

BOJ

목록 보기
14/69
post-thumbnail

백준 2941번 : 크로아티아 알파벳 S5

2941번: 크로아티아 알파벳

  • 크로아티아 알파벳의 개수를 세어야 함
  • 배열로 풀 때 참조하려는 인덱스가 벗어나지 않는지 유의해야 함
  • 위 8개의 문자는 특정 조건에 의해 변경되어 하나의 문자를 이루게 됨
import java.util.Scanner;

public class croatia {
    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); //입력받은 문장은 ch에 하나 씩 넣어주고

            if(ch == 'c') {			// 만약 ch 가 c 라면?
                if(i < str.length() - 1) {
                    if(str.charAt(i + 1) == '=') {		//만약 ch 다음 문자가 '=' 이라면?
                        // i+1 까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 1 증가
                        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++;

        }

        System.out.println(count);
    }

        }
  1. String 문자열을 입력받고 알파벳 숫자를 카운트 할 변수 선언 및 초기화를 해줌

  2. 문자열의 크기만큼 for문을 반복하면서 charAt메소드로 ch 변수에 하나 씩 넣고 검사 해줌

  3. 만약 c=와 c-가 입력 되어 있다면 이 두 개의 문자를 하나의 문자로 보는 것이기 때문에 다음 반복문에서 = , - 을 참조할 필요가 없음

  4. c인경우에 그 i + 1 즉, 그 다음 문자가 = , - 이면 count값을 증가 시켜 줌 그 과정에서 i를 증가시키고 for문을 한 바퀴 돌면서 다시 i가 증가 되기 때문에 c= 또는 c- 를 하나의 단어로 묶을 수 있음

  5. 하지만 만약 입력 값이 ‘aedzdz=ls=c’ 이고 i가 10일때 반복문을 생각해보면

  6. i = 0이고 a는 count 1증가

  7. i = 1이고 e는 count 1 증가

  8. i = 2이고 d는 count 1증가

  9. i = 3이고 z는 count 1 증가

  10. i = 4이고 d다음 z= 이 있기 때문에 묶어서 count1 증가 i가 6으로 증가

  11. i = 7되고 l 은 count 1증가

  12. i = 8되고 s는 count 1증가

  13. i = 9 되고 = 는 count 1 증가

  14. 이때 for문은 0부터 10까지 돌게 되어있음

  15. i 가 =10 일때 c는 기존 코드인

if(str.charAt(i + 1) == '=') 

조건을 검사하다가 문제가 발생함

if(str(10+1) 즉 , 이 문자열에서 마지막 c 다음의 문자는 존재하지 않는데, 그것을 charAt을 통해 참조하려고 하니까 에러가 발생 함

  1. 해결 방법은 현재 i의 값이 문자열 길이에서 -1한 값보다 작을 경우에만 다음 조건문을 실행시키면 됨
if(ch == 'c') {			// 만약 ch 가 c 라면?
                if(i < str.length() - 1) {
                    if(str.charAt(i + 1) == '=') {		//만약 ch 다음 문자가 '=' 이라면?
                        // i+1 까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 1 증가
                        i++;
	                    

새로운 if문을 추가하고 i 가 10일 때 10<10 이 되어 조건이 성립하지 않음 , 그래서 해당 조건문 블록을 건너 뛰고 count 값만 증가시킨 다음 for문을 탈출함

0개의 댓글