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

▶ 설명
크로아티아 알파벳을 문자 배열에 담고
입력 값이 주어지면 크로아티아 문자배열 인덱스 순서에 따라 요소 전체를 대입해주면서
입력 문자에서 포함된 문자가 있을 시 통일된 한 글자로 치환해주는 식으로 하여 반복문을 실행해 문제를 해결해 보았다.
반복문에서 입력 문자에 크로아티아 알파벳이 포함되었는지 아닌지를 어떻게 판단할지
그리고 포함된 문자가 존재한다면 어떻게 하나의 문자로 치환해 줄지를
고민해 보았고, indexOf(), replace(), contains() 메소드를 활용해서 코드를 짜 보았다.
관련 method 들은 자바의 정석 책과 Java API 문서를 통해 참고하여 적용하였다.
JAVA String API :
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
JAVA String method 예시 참고 :
https://www.programiz.com/java-programming/library/string/getbytes
▶ 문제 풀이
🌱 풀이 1. indexOf(), replaceAll() 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] croatiaAlphabet = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
int index = 0;
for (int i = 0; i < croatiaAlphabet.length; i++) {
index = s.indexOf(croatiaAlphabet[i]);
if (index >= 0) {
s = s.replaceAll(croatiaAlphabet[i], "A");
}
}
System.out.println(s.length());
}
}
index = s.indexOf(croatiaAlphabet[i]);
indexOf() 는 입력한 글자에 크로아티아 알파벳이 포함되지 않으면 -1을 반환하고,
포함되면 해당 문자배열의 index를 반환한다.
이 indedOf()는 이전 문제풀이에서 유용하게 사용했었던 메소드이다. (10809번 알파벳 찾기)
s = s.replaceAll(croatiaAlphabet[i], "A");
반환된 값이 -1을 넘으면 (크로아티아 알파벳이 입력한 글자에서 검색되었다면),
한 단어로 된 A로 바꿔주었다.
이렇게 되면 음절을 세는 것으로 쉽게 출력할 수 있게 된다.
여기서 조심해야 할 게, replaceAll () 안의 A를 작은 따움표가 아닌 큰 따움표로 감싸야 한다.
그렇지 않으면 컴파일 에러가 난다.
다음의 다른 풀이들도 구조가 크게 다르지 않아 새로 사용된 메소드의 예시로 설명하려 한다.
🌱 풀이 2. replace() 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] croatiaAlphabet = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
for(String val : croatiaAlphabet) {
s = s.replace(val, "A");
}
System.out.println(s.length());
}
}
- replace() 메소드의 예시 (bat ball -> cat call -- b를 c로 모두 바꿈)
🌱 풀이 3. contains(), replace() 사용
package boj.string.otherCode;
//크로아티아 알파벳
//다른 코드
//contains(), replace() 사용. 124ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Boj_2941_3 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
br.close();
String[] croatiaAlphabet ={"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
int cnt = 0;
for(String val : croatiaAlphabet) {
while( str.contains(val) ) {
s = s.replace(val, "A");
}
}
cnt += s.length();
System.out.print(cnt);
}
}
- contains() 메소드의 예시 ("Java String contains()" 에서 "Java" 라는 문자가 있는지 체크하기)
▶ Log
문자열의 메소드는 사용법이 간단하지만 자주 잊어버리곤 한다.
능숙하게 사용할 수 있도록 연습해야겠다.
'백준 알고리즘 > 문자열' 카테고리의 다른 글
[JAVA 자바] 백준 1316번 : 그룹 단어 체커 (0) | 2022.06.09 |
---|---|
[JAVA 자바] 배준 5622 : 다이얼 (0) | 2022.06.07 |
[JAVA 자바] 백준 2908번 : 상수 (0) | 2022.06.06 |
[JAVA 자바] 백준 1152번 : 단어의 개수 (0) | 2022.06.05 |
[JAVA 자바] 백준 1157번 : 단어 공부 (0) | 2022.06.04 |