2022. 4. 16. 23:17ㆍ코딩 테스트(JAVA)/백준
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경č | c= |
ć | c- |
dž | 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 |