본문 바로가기

오늘 이거 알았네요/Java

[Java] Map에서 key로 value 또는 value로 key 값 추출하기

728x90

정처기 실기로 고통받는 와중에 알고리즘 푸는 게 더 재밌어

그리고 그걸 또 블로그에 정리한다? 더 재밌어...

 

눈물 흘리다.. 

😇 Map에서 값을 뽑아내려면 어떻게 하는지 알아보자. 

 

그럼 본론으로.

 

 

 

Map에서 값을 추출하자

 

Map<String, String> animal = new HashMap<>();
    animal.put("노랑","원숭이");
    animal.put("그레이","코뿔소");
    animal.put("황토","기린");
    animal.put("자주","치타");
    animal.put("하늘","고래");

for(String key : animal.keySet()){
  System.out.println(String.format("key: %s, value: %s", key, animal.get(key)));
}

// key: 그레이, value: 코뿔소
// key: 자주, value: 치타
// key: 하늘, value: 고래
// key: 황토, value: 기린
// key: 노랑, value: 원숭이

잠깐 💡
hashMap은 코드상으로 순차적 key/value를 넣어도 순서가 보장되지 않는다

 

 

 

key로 value 값을 추출하려면 

for문안에 조건을 걸어주면 된다.

 

for(String key : animal.keySet()){
    if(key.equals("그레이")){
        System.out.println( String.format("key: %s, value: %s", key, animal.get(key)));
    }
}

 

 

 

 

value로 key 추출하려면

조건에 바꿔서 걸어주면 되겠지요 ??? 

 

 

 

 

 

자 이제 문제를 풀어볼까요? 

 

 

 

프로그래머스 120838 - 모스 부호(1)

 

[문제]

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해 보세요.

모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}
 

 

 

[나의 풀이]

저는 이렇게 계획했습니다.

 

1. letter는 공백을 기준 잘라서 배열을 만들자

2. 모스부호를 HashMap에 넣고

3. letter배열을 for문으로 돌려 모스부호 map의 key값과 비교하여 일치하면 stringbuilder에 추가 

4. 스트링 빌더 toString으로 문자열 만들어 리턴 

 

public class Solution {
    public String solution(String letter){
        String answer = "";
        String[] splitLetter =  letter.split(" ");
        Map<String, String> morse = new HashMap<>();
            morse.put(".-","a");
            morse.put("-...","b");
            morse.put("-.-.","c");
            morse.put("-..","d");
            morse.put(".","e");
            morse.put("..-.","f");
            morse.put("--.","g");
            morse.put("....","h");
            morse.put("..","i");
            morse.put(".---","j");
            morse.put("-.-","k");
            morse.put(".-..","l");
            morse.put("--","m");
            morse.put("-.","n");
            morse.put("---","o");
            morse.put(".--.","p");
            morse.put("--.-","q");
            morse.put(".-.","r");
            morse.put("...","s");
            morse.put("-","t");
            morse.put("..-","u");
            morse.put("...-","v");
            morse.put(".--","w");
            morse.put("-..-","x");
            morse.put("-.--","y");
            morse.put("--..","z");
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i < splitLetter.length; i++){
            for(String key : morse.keySet()){
                if(splitLetter[i].equals(morse.get(key))){
                    sb.append(splitLetter[i]);
                }
            }
        }
        answer = sb.toString();
    
        return answer;
    }
}

 

엥...? 왜 값이 안 들어가지  

 

if문 안에 .get(key) 그러니까 모스부호splitLetter[i]랑 알파벳(morse map의 value값 ㅎ)이 같냐고 하니까

당연히 같은 게 없으니까 답이 안 나오지 

(+ 그 바로 아래 sb.append(splitLetter [i]) 이것도 아니었음)ㅋㅋㅋ

 

 

다시 !!!!

 

[통과한 코드]

class Solution {
public String solution(String letter){
    String answer = "";
        String[] splitLetter =  letter.split(" ");
        Map<String, String> morse = new HashMap<>();
            morse.put(".-","a");
            morse.put("-...","b");
            morse.put("-.-.","c");
            morse.put("-..","d");
            morse.put(".","e");
            morse.put("..-.","f");
            morse.put("--.","g");
            morse.put("....","h");
            morse.put("..","i");
            morse.put(".---","j");
            morse.put("-.-","k");
            morse.put(".-..","l");
            morse.put("--","m");
            morse.put("-.","n");
            morse.put("---","o");
            morse.put(".--.","p");
            morse.put("--.-","q");
            morse.put(".-.","r");
            morse.put("...","s");
            morse.put("-","t");
            morse.put("..-","u");
            morse.put("...-","v");
            morse.put(".--","w");
            morse.put("-..-","x");
            morse.put("-.--","y");
            morse.put("--..","z");
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i < splitLetter.length; i++){
            for(String key : morse.keySet()){
                if(splitLetter[i].equals(key)){
                    sb.append(morse.get(key));
                }
            }
        }
        answer = sb.toString();
    
        return answer;
    }
}

 

 

오예 

728x90