[JAVA]백준 알고리즘/단계별 - 문자열

[JAVA]백준 알고리즘 2941번 : 크로아티아 알파벳

코린이J 2023. 1. 16. 16:45
728x90

https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

 

풀이

입력된 알파벳의 개수를 세는 문제이다.

단, 위 표에 있는 문자열이 입력될 경우 하나의 알파벳으로 보아야 한다.

 

필자는 입력받은 문자열의 길이에서 위 표에 있는 문자열이 입력될 때마다 빼는 방법으로 해결하였다.


🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.

더보기

1. 표에 있는 문자열 중에 가장 긴 문자열이 3개이기 때문에, 최대 3개까지 검사하기 위하여 크기가 2인 char 배열을 생성했다.

char tmp[] = new char[2];

 

2. 문자열의 길이를 total 변수에 입력한다.

int total = S.length();

 

3. 문자열의 길이만큼 반복문을 돌린다. (now : i번째 문자, tmp [1] : i - 1번째 문자, tmp [0] : i - 2번째 문자)

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

3-1. 아래 코드는 "c-"와 "d-"를 찾는 조건이다.(두 글자가 하나의 문자이므로 total에서 1을 뺀다.)

if((tmp[1] == 'c' || tmp[1] == 'd') && now == '-') total--;

3-2. 아래 코드는 "dz="를 찾는 조건이다.(세 글자가 하나의 문자이므로 total에서 2를 뺀다.)

else if(tmp[0] == 'd' && tmp[1] == 'z' && now == '=') total -= 2;

3-3. 아래 코드는 "z="를 찾는 조건이다. 단, "z=" 앞에 'd'가 있으면 "dz="이므로, "z=" 앞에 "d"가 오지 않아야 한다.(else if문이기 때문에 tmp [0]!= 'd'를 작성하지 않아도 오류가 발생하지 않지만 보기 쉽게 작성하였다.)

else if(tmp[0] != 'd' && tmp[1] == 'z' && now == '=') total--;

3-4. 아래 코드는 "lj"와 "nj"를 찾는 조건이다.

else if( (tmp[1] == 'l' || tmp[1] == 'n') && now == 'j') total--;

3-5. 아래 코드는 "s="와 "c="를 찾는 조건이다.

else if( (tmp[1] == 's' || tmp[1] == 'c') && now == '=') total--;

3-6. 이후, tmp [0]에는 tmp [1]을, tmp [1]에는 now를 넣는다.(하나씩 당긴다.)

tmp[0] = tmp[1];
tmp[1] = now;

 

4-1. 위 반복문을 돌린 후 총합을 출력한다.

System.out.println(total);

코드

BufferedReader 클래스를 이용한 코드

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();
        char tmp[] = new char[2];
        int total = S.length();

        for(int i = 0; i < S.length(); i++) {
            char now = S.charAt(i);
            if((tmp[1] == 'c' || tmp[1] == 'd') && now == '-') total--;
            else if(tmp[0] == 'd' && tmp[1] == 'z' && now == '=') total -= 2;
            else if(tmp[0] != 'd' && tmp[1] == 'z' && now == '=') total--;
            else if( (tmp[1] == 'l' || tmp[1] == 'n') && now == 'j') total--;
            else if( (tmp[1] == 's' || tmp[1] == 'c') && now == '=') total--;

            tmp[0] = tmp[1];
            tmp[1] = now;
        }
        System.out.println(total);
    }
}

 

틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!

728x90