[BOJ] 2941 크로아티아 알파벳 (JAVA)

joyful·2021년 4월 10일
0

Algorithm

목록 보기
49/62

✅ 문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
čc=
ćc-
dz=
đd-
ljlj
njnj
šs=
žz=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

✅ 입력

  • 첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

  • 단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

✅ 출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

✅ 예제 1

▼ 입력

ljes=njak

▼ 출력

6

✅ 예제 2

▼ 입력

ddz=z=

▼ 출력

3

✅ 예제 3

▼ 입력

nljj

▼ 출력

3

✅ 예제 4

▼ 입력

c=c=

▼ 출력

2

풀이

문자 한 개로 이루어지지 않은 크로아티아 알파벳 → 크파벳

  1. 크파벳을 미리 문자열 배열(cAlpha)에 저장해놓는다.

  2. 입력받은 단어(str)말고 크파벳 배열을 기준으로 for문 돌려야 한다. str을 기준으로 루프를 실행하게 되면 크파벳을 찾기가 힘들어진다.
    또한, 도입부에서 StringBuffer.indexOf()를 이용하여 크파벳의 사용 시작 위치(인덱스)를 전달받는다. 이 메소드는 사용된 알파벳이라면 문자의 시작 위치를, 사용된 알파벳이 아니라면 -1을 리턴한다.

  3. 입력받은 단어에 동일한 크파벳이 여러번 쓰일수도 있으므로, for문의 내부에 반복문을 하나 더 실행시켜야 한다.
    인덱스 =! -1이 아닐 때 크파벳을 1개의 임의의 문자로 변환해준다. 이는 크파벳을 문자 한개로 인식하도록 하기 위함인데, String.replace()는 원하는 위치의 문자만을 제거할 수 없으므로 StringBuffer.replace()를 사용해야 한다.
    또한 크파벳이 사용되었으므로 문자의 갯수를 카운트 한다.

  4. 루프를 종료하고 나면 크파벳을 제외한 알파벳이 남게 된다. 반복문을 통해 단어의 모든 문자를 검사하며 str의 알파벳!=임의의 문자인 경우 문자의 갯수를 카운트 한다.

💻 코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		String[] cAlpha = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
		
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine(); // 단어 입력받기
		StringBuffer sb = new StringBuffer();	// 버퍼 사용(원하는 위치의 문자를 변환하기 위함)
		sb.append(str);
		scanner.close(); 
		
		int cnt = 0; // 문자의 갯수
		
		for(int i=0; i<cAlpha.length; i++) {
			int idx = sb.indexOf(cAlpha[i]);  // 크파벳이 포함된 문자열 시작 위치
			
			while(idx != -1) {  // 크파벳이 존재하는 동안
				cnt++;	// 문자 갯수 count
				int idx2 = idx + cAlpha[i].length();  // 사용된 크파벳의 끝 위치
				sb.replace(idx, idx2, "0");  // 크파벳을 임의의 문자 "0"으로 변환
				
				idx = sb.indexOf(cAlpha[i]);  // 같은 크파벳이 사용된 위치가 있는지 검색
			}
		}
		
		for(int i=0; i<sb.length(); i++) {
			if(sb.charAt(i) != '0')
				cnt++;	// 문자 갯수 count
		}
		
		System.out.println(cnt);
	}
}
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글