[백준 2941번] 크로아티아 알파벳

2022. 4. 16. 23:17코딩 테스트(JAVA)/백준

문제

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

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

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

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

입력

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

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

출력

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

예제 입력 1 복사

ljes=njak

예제 출력 1 복사

6

예제 입력 2 복사

ddz=z=

예제 출력 2 복사

3

예제 입력 3 복사

nljj

예제 출력 3 복사

3

예제 입력 4 복사

c=c=

예제 출력 4 복사

2

예제 입력 5 복사

dz=ak

예제 출력 5 복사

3

 

문제 분석

1. key : value를 통해 (변경 : 크로아티아 알파벳) 담아두기

2. 입력

   크로아티아 알파벳이 아닌 변경된 알파벳을 입력합니다.

3. 입력 -> for문을 돌면서 확인 후 배열에 넣기

    '변경'이 입력값이 있는지 개수 cnt++

     없는 건 하나하나 cnt++

4. 출력 : 배열의 길이

 

HashMap vs LinkedHashMap 

https://fruitdev.tistory.com/141

public static void main(String[] args) {
        LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>(); 
        lhm.put("apple", "빨강");
        lhm.put("banana","노랑");
        lhm.put("kiwi", "초록");
        
        System.out.println(lhm.entrySet());
        System.out.println(lhm.keySet());
        System.out.println(lhm.values());
    }

 

 

실패 코드

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// key : value를 통해 (변경 : 크로아티아 알파벳) 담아두기
		HashMap<String, String> hm = new HashMap<>();
		hm.put("c=","č");
		hm.put("c-","ć");
		hm.put("dz=","dž");
		hm.put("d-","đ");
		hm.put("lj","lj");
		hm.put("nj","nj");
		hm.put("s=","š");
		hm.put("z=","ž");
		// 배열에 넣기
		String[] mKeys = hm.keySet().toArray(new String[hm.size()]);
		//System.out.println(Arrays.toString(mKeys)); // [z=, dz=, d-, c=, c-, s=, nj, lj]
       
		// '변경'문자열 입력
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		
		// str에 containsKey가 있는지 확인
		for(int i=0; i<mKeys.length; i++) {
			if(str.contains(mKeys[i])) {
				// 단순히 개수만 세는 것이므로 다른 "한 문자"로 replace해도 무방하다
				str = str.replace(mKeys[i], "*");
			}
		}
		// 출력 : str의 길이
		System.out.println(str);
		System.out.println(str.length());
	}

}

// 출력
ljes=njak -- O
*e**ak
6

ddz=z= -- X 출력3
dd**
4

nljj  -- O
n*j
3

c=c= -- O
**
2

dz=ak-- X 출력3
d*ak
4

코드만 보면 맞는 것 같은데 채점을 받아보았을 때 자꾸 틀렸다고 해서

예제 입력을 하나씩 찍어보았더니 어떤 것을 수정 보완해야 하는지 알 수 있었다. 역시 노가다 짱

입력 예제 2,5 모두 dz=로 읽어야 하는 데 z=으로 인식해서 발생한 문제였다.

이 문제를 해결하기 위해서 HashMap을 LinkedHashMap으로 변경하였다.

 

성공 코드


import java.util.*;

public class Main {

	public static void main(String[] args) {
		// key : value형태로 (변경 : 크로아티아 알파벳) 담기
		LinkedHashMap<String, String> hm = new LinkedHashMap<>();
		hm.put("c=","č");
		hm.put("c-","ć");
		hm.put("dz=","dž");
		hm.put("d-","đ");
		hm.put("lj","lj");
		hm.put("nj","nj");
		hm.put("s=","š");
		hm.put("z=","ž");
		// key만 배열에 넣기
		String[] hmKeys = hm.keySet().toArray(new String[hm.size()]);
		//System.out.println(Arrays.toString(hmKeys)); // [c=, c-, dz=, d-, lj, nj, s=, z=]
       
		// '변경'문자열 입력
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		
		// str에 hmKeys가 있는지 확인
		for(int i=0; i<hmKeys.length; i++) {
			if(str.contains(hmKeys[i])) {
				// 단순히 개수만 세는 것이므로 특정 "한 문자"로 replace해도 무방
				str = str.replace(hmKeys[i], "*")
			}
		}
		// 출력 : str의 길이
		//System.out.println(str);
		System.out.println(str.length());
	}

}

 

 

'코딩 테스트(JAVA) > 백준' 카테고리의 다른 글

[백준 1316번] 그룹 단어 체커  (0) 2022.04.17
[백준 13164번] 행복 유치원  (0) 2022.04.17
[백준 14916] 거스름돈  (0) 2022.04.16
[백준 5622번] 다이얼  (0) 2022.04.16
[백준 1152번] 단어의 개수  (0) 2022.04.15