일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[백준] 2941번 - 크로아티아 알파벳 (Java) 본문
728x90
문제
https://www.acmicpc.net/problem/2941
코드
import java.util.Scanner;
// 크로아티아 알파벳
public class Ex_2941 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
StringBuffer sb = new StringBuffer();
int count = 0;
// 시작하는 문자에 따라 체크 (c, d, l, n, s, z)
for (int i = 0; i < str.length(); i++) {
char first = str.charAt(i); // 시작 문자
char second = i + 1 < str.length() ? str.charAt(i + 1) : 'a'; // 다음 문자
char third = i + 2 < str.length() ? str.charAt(i + 2) : 'a'; // 다다음 문자
count++;
switch (first) {
case 'c': // c=, c-
if (second == '=' || second == '-')
i++; // i ~ i+1 까지 한 문자이므로 다음 문자 1개 패스
break;
case 'd': // d-, dz=
if (second == '-')
i++;
else if (second == 'z' && third == '=')
i += 2; // i ~ i+2 까지 한 문자이므로 다음 문자 2개 패스
break;
case 'l': case 'n': // lj, nj
if (second == 'j')
i++;
break;
case 's': case 'z': // s=, z=
if(second == '=')
i++;
break;
}
}
System.out.println(count);
}
}
- charAt(int index) 메서드로 문자를 하나씩 가져온다.
- 읽어들인 문자를 시작 문자(first)라고 했을 때, 다음 문자(second)와 다다음 문자(third)를 가져온다. (크로아티아 알파벳은 2~3글자)
- 문자열 s가 "dz=" 일 경우
first = 'd'
second = 'z'
third = '='
~와 같이 초기화된다.
- 문자열 s가 "dz=" 일 경우
- 단, 마지막 글자(i가 str.length() -1) or 마지막에서 두번째 글자(i가 str.length() -2)일 경우에는 charAt(i+1), charAt(i+2)로 다음 글자들에 접근하려 할 경우 StringIndexOutOfBoundsException 예외가 발생한다. (=접근하려는 인텍스가 배열 크기를 넘어감) 이를 방지하기 위해서 위의 경우에는 크로아티아 알파벳과 전혀 상관없는 아무 문자('a')로 값을 초기화해준다.
- 크로아티아 알파벳은 무조건 c, d, l, n, s, z 6개 알파벳 중 하나로 시작한다. switch문으로 시작 문자를 체크해 각각 다르게 동작하도록 작성한다.
- first+second 문자 조합이 크로아티아 알파벳과 일치할 경우, first+second 는 하나의 문자로 취급하므로 for문에서 second 문자 차례는 그냥 넘기도록 한다. (이미 문제 세트를 이뤘으므로)
- first+second+third 문자 조합이 크로아티아 알파벳과 일치할 경우 second, third 문자 차례를 연달아 2번 그냥 넘기도록 한다.
728x90
'Algorithm' 카테고리의 다른 글
[백준] 2292번 - 벌집 (Java) (0) | 2022.02.08 |
---|---|
[백준] 1346번 - 그룹 단어 체커 (Java) (0) | 2022.02.07 |
[백준] 5622번 - 다이얼 (Java) (0) | 2022.02.07 |
[백준] 2908 번 - 상수 (Java) (0) | 2022.02.07 |
[백준] 1065번 - 한수 (Java) (0) | 2022.02.04 |
Comments