예를들어 map 은
key 값으로 int 등이 들어가면
해당하는 String 등의 값을 출력하는 식으로 사용한다.
( 혹은 반대거나 )
1 => 가
2 => 나
3 => 다
키값과 value값을 반대로 집어넣은 map을 만든다면
가 => 1
나 => 2
다 => 3
이렇게 나올 것이다.
이걸 응용해서 문제에서 위의 두가지 key value 매칭을 동시에 만족시키게 만들길 요구한다면
가 => 1
2 => 나
다 => 3
3 => 다
이런식으로 넣는 key값에 따라 두가지 경우의 value 값이 다 도출 되야 한다.
처음 접근은
1 => 가
2 => 나
3 => 다
이 일방향 맵만 만들고
(1) int로 들어오면 바로 get() 으로 해당 value를 출력
(2) value 값인 '가' 가 들어오면,
keySet 을 뽑아내면서
반복문으로 각 key당 value 를 찾고 equals. 을 사용해
'가' 와 같은 값을 가진 key 를 찾고 그 key 값을 출력.
for (Integer k : map.keySet()
) {
if ( 입력값이 int가 들어오면 ){ System.out.println(map.get(Integer.parseInt(br2.readLine()))); //바로 겟
}
else if((br2.readLine()).equals(map.get(k))) { System.out.println(k);} }
// 입력값이 String이면 value중에 일치할때 키 찾아서
이런 접근을 했는데,
먼저 "int" 로 들어올때와
"String" 으로 들어올때를 구별해서 받아야 하는데
그 부분이 쉽지가 않았다.
- numberforamt 오류가 난다.
즉, 결국엔 숫자를 먼저 받을때의 처리문
아니면 문자일때를 먼저 받을때의 처리 문을 먼저 쓰느냐 둘 중에 하나를 쓸 수밖에 없는데,
그럼 처음 처리문에서 다른 타입이 들어왔을 때 numberformat 오류를 마주칠 수밖에 없었다.
결국은 숫자냐 문자냐 구별해내는게 먼저 필요.
이 숫자냐 문자냐 구별을 따로 메소드로 뽑아내는 방법이 있었다.
public static boolean isStirngNumber(String s){
try {
Double.parseDouble(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
String 을 숫자타입으로 강제형변환 하고
그게 성공한다는건 String 이지만 숫자타입으로 들어온 것을 의미. true를 줘놓고
이게 numberformat 오류가 난다는 건
숫자 타입이 아니라는 의미.
여긴 false 를 줘놓는다.
if ( isStringNumber( br.readLine )){
true 이면 =>숫자일때의 출력값 }
else{ 문자일때의 출력값 }
이렇게 하면 처음 내가 접근하려했던 방법도 가능하겠다.
언제고 유용하게 쓰일법한 방법이니 익혀둬야겠다.
< boolean타입 구분해내는 메소드 try catch활용해서 만들고 그걸로 if문 조건주기 >
막혔으면 빠르게 돌려서 다른 방법을 찾는것도 좋을 듯 싶다.
2. charAt 유니코드로 0~9 까지 숫자값인지로 판별하기
+양방향 맵
HashMap<Integer, String> map1 = new HashMap<Integer, String>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
for(int i = 1; i <= N; i++) {
String S = br.readLine();
map1.put(i, S);
map2.put(S, i); }
for(int i = 0; i < M; i++) {
String S = br.readLine();
if(49 <= S.charAt(0) && S.charAt(0) <= 57) {
System.out.println(map1.get(Integer.parseInt(S)));
}else {System.out.println(map2.get(S));}
}
}
}
이 방법이 생각하기는 더 쉬운것 같긴 하지만
첫번 째 방법이 0~9 뿐만 아니라 double 의 경우까지 아우를수 있는 더 좋은 방법이므로 익혀둬야 겠다.
+ 2번째에서는 key value 값을 순서를 바꿔서 두개의 map을 만들어서 사용하는 방법을 사용했다.
이렇게 하면 반복문으로 매번 key 에 해당하는 value 값을 일일이 equals 대조시킬 필요가 없기 때문에 더 효율적인 방법!
최종적으로
=> 1. boolean타입 구분해주는 메소드 만들어서 문자냐 인트냐 구분해서 조건문걸고
=> 2. 문자 - 숫자 / 숫자 - 문자 맵 두개만들어놓고
boolean결과에 따라서 맵 걸어두기
방식을 사용하는게 좋은 접근이 될 것 같다.
'Coding Test' 카테고리의 다른 글
2022 우테코 onboarding 3~4번 리뷰 (0) | 2022.11.08 |
---|---|
2022 우테코 onboarding 1~2번 리뷰 (0) | 2022.11.08 |
SubTotal 부분합 = 전체합 - (부분-1) (0) | 2022.07.29 |
Scanner/StringBuilder/ BufferedReader/Writer / StringTokenizer / 입출력정리 (0) | 2022.07.29 |
[Set / Map] 중복된 데이터 개수 - contains / retainAll / removeAll / key / map.get ( key (0) | 2022.07.17 |