Study/Baekjoon

Baekjoon2941*: 크로아티아 알파벳

devyoseph 2021. 10. 11. 21:55
<문제>
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

<입력>
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
<출력>
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

추상화
구상1 단어를 반복문 안에서 분석하는 방법
입력된 단어의 길이를 가져온 뒤 단어 안에서 위에서 주어진 8개의 알파벳을 탐색하는 것이다
하지만 탐색하기 위해서 i뿐 아니라 i 다음 순번의 index를 가져와서 비교해야되는데 문장의 처음이나 끝에서 탐색할 경우 비교하기 위한index가 밖으로 넘어가는 문제가 발생한다. 그래서 일단 보류하고 다른 방법을 생각했다
구상2 해당하는 알파벳을 단어에서 지워가는 방법
1. 단어에서 위 8개의 알파벳을 순서대로 지워주는 방식을 사용해본다
2. .replace(String, 대체할 문자)를 이용해 해당 단어를 한번에 지울 수 있다
3. 지워주는 알파벳의 길이를 length로 변수화하고, 지워주기 전 단어의 길이(before) 지워주고 난 후 단어의 길이(after)로 만들어서
(before-after)/length를 통해 지워준 알파벳의 개수를 구한다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   String s = br.readLine();
	   String[] alphabet = {"c=","c-", "dz=", "d-", "lj", "nj", "s=", "z="};
//배열 안에 크로아티아 알파벳을 정리했다. dz=와 z=가 겹치므로 dz=가 앞으로 오도록 한다
	   int sum = 0;
	   for(int i =0; i<8; i++) {
		   sum += count(s, alphabet[i]);
		   s = s.replace(alphabet[i], "");
//count해주고 s를 재설정해주어야 함을 주의한다
	   }
	   sum += s.length();
	   System.out.println(sum);
	}
public static int count(String s, String a) {
	int length = a.length();
	int before = s.length();
	int after = s.replace(a, "").length();
	int count = (before-after)/length;
	return count;
	}
}
하지만 문제가 발생한다
nljj 를 입력했다고 하자. n lj j 총 3개의 알파벳이지만 위 코드를 실행하면
lj가 없어지고 nj도 단어로 인식되어 사라져 알파벳 개수를 2개로 계산해버린다

해결: 단어를 지우는 방식이 아닌 대체하는 방식을 채택한다. 예를 들면 알파벳 'lj'는 모두 '*'로 대체된다
구상3 해당하는 알파벳을 특정 문자 1개로 대체하는 방법
구상2의 단점을 보완할 수 있다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   String s = br.readLine();
	   String[] alphabet = {"c=","c-", "dz=", "d-", "lj", "nj", "s=", "z="};
	   for(int i =0; i<8; i++) {
		   s = s.replace(alphabet[i], "*");
//해당하는 알파벳을 *로 대체한다
	   }
	   System.out.println(s.length());
// *은 하나의 알파벳을 뜻한다. 대체된 문장의 길이가 곧 알파벳의 개수이다
	}
}

'Study > Baekjoon' 카테고리의 다른 글

Baekjoon1712: 손익분기점, Scanner의 위대함  (0) 2021.10.12
Baekjoon1316*: 그룹 단어 체커  (0) 2021.10.11
Baekjoon5622: 다이얼  (0) 2021.10.11
Baekjoon2908: 상수  (0) 2021.10.10
Baekjoon1157: 단어 공부  (0) 2021.10.10