[백준/자바] 2941 크로아티아 알파벳
📌 문제
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
⚔ 입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
📣 출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
💎 문제분석
Regex 매치 로직을 이용한다.
주의할 점은 예제 2번과 같은 케이스인데 3개 글자가 한개 밖에 없으므로 list iteration시에 처음에 위치시켜줌으로써 해결한다.
💡 코드 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
private static int answerCount;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String wordOriginal = st.nextToken();
String wordNonCroatian = wordOriginal;
// wordNonCroatian은 프로그램상 redundant하여 wordOriginal과 합쳐 하나의 word 변수로 사용할 수 있지만
// 의미상의 명확성을 두개 변수를 각각 선언해줌
String[] croatians = {"dz=", "c=", "c-", "d-", "lj", "nj", "s=", "z="};
for (String croatian : croatians) {
Matcher matcher = alphabetMatcher(wordNonCroatian, croatian);
wordNonCroatian = calculateMatch(wordNonCroatian, matcher);
}
System.out.println(countNonCroatian(wordNonCroatian));
}
private static int countNonCroatian(String wordNonCroatian){
return answerCount + wordNonCroatian.replace(".","").length();
}
private static String calculateMatch(String word, Matcher matcher) {
if (isContainsCroatian(matcher)) {
answerCount++;
return calculateMatch(removeMatched(word, matcher), matcher);
}
return word;
}
private static Matcher alphabetMatcher(String word, String croatian) {
Pattern pattern = Pattern.compile(croatian);
return pattern.matcher(word);
}
private static boolean isContainsCroatian(Matcher matcher) {
return matcher.find();
}
private static String removeMatched(String word, Matcher matcher) {
String matches = matcher.pattern().toString();
return word.replaceFirst(matches, ".");
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준/파이썬] 1712 손익분기점 (2) | 2022.11.30 |
---|---|
[백준/자바] 1316 그룹 단어 체커 (단계별로 풀어보기 문자열 클리어) (0) | 2022.11.30 |
[백준/자바] 5622 다이얼 (0) | 2022.11.30 |
[백준/파이썬] 1065 한수 (0) | 2022.11.30 |
[백준/파이썬] 4673 셀프 넘버 (1) | 2022.11.30 |