[JAVA]백준 알고리즘 2941번 : 크로아티아 알파벳
https://www.acmicpc.net/problem/2941
2941번: 크로아티아 알파벳
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=
www.acmicpc.net
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경
č | c= |
ć | c- |
dž | 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);
}
}
틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!