2941번: 크로아티아 알파벳
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=
www.acmicpc.net
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine();
String[] alphabets = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
for(String see : alphabets){
str = str.replaceAll(see, "a");
}
bw.write(String.valueOf(str.length()));
bw.flush();
}
}
(1) 크로아티아 알파벳에 대한 정규 표현식
String[] alphabets = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
- 문제에서 언급한 크로아티아 알파벳을 String[] 배열에 담아놓는다.
- 이는 반복문을 순회할 때, 배열에 저장된 크로아티아 알파벳이 나올 경우 "한 단어"로 치환하기 위함이다.
(2) 크로아티아 알파벳을 찾아 치환
for(String see : alphabets){
str = str.replaceAll(see, "a");
}
- 위에 설명한 내용 그대로 alphabets[] 문자열 배열을 순회하면서, 크로아티아 알파벳이 나올 경우 "a" (임의의 문자)로 치환한다.
- replaceAll() 메서드는 자바의 String 클래스에서 제공되는 메서드 중 하나인데, 특정 패턴에 일치하는 문자열을 다른 문자열로 교체하는 데에 사용된다. 이 메서드는 정규 표현식을 사용하여 패턴을 지정할 수 있다. 위 코드의 의미는 결국 str 문자열에서 see에 해당하는 부분(크로아티아 알파벳)을 모두 "a"로 치환한다. 라는 뜻..
문제의 핵심은 "입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있나?" 이므로, 크로아티아 문자를 탐색하여 해당 문자가 나올 경우 한 글자로 치환하고, 총 단어의 길이를 출력하게끔 로직을 구현하면 된다.
특정한 규칙이 있는 문제가 아니며, 직관적으로 파악할 수 있는 문제라고 판단하였기에 replaceAll() 메서드와 정규표현식의 사용법을 잘 익히고 있다면 쉽게 해결할 수 있는 문제라고 생각한다.
결과
java로 클린코드 짜기는 참 어렵다..
코드 길이를 열심히 줄여보자...
'Algorithm' 카테고리의 다른 글
[BOJ/Java] 1157 단어 공부 (0) | 2023.12.07 |
---|