본문 바로가기
알고리즘/백준

[백준/자바] 2941 크로아티아 알파벳

by Renechoi 2022. 11. 30.

[백준/자바] 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, ".");
	}
}

 

 

 

 

 

 

 

 

 


반응형