[백준] 1620번 : 나는야 포켓몬 마스터 이다솜

김건우·2024년 2월 6일
0

문제 풀이

목록 보기
42/62

나는야 포켓몬 마스터 이다솜


풀이 방법

이 문제는 HashMap을 사용해서 Key값이 들어왔을 때는 Value값을, Value값이 들어왔을 때는 Key값을 반환해줘야 하는 문제였다.

처음 쉽게 코드를 작성해서 정답 비율에 비해 생각보다 쉽네? 라고 생각했는데,
바로 시간초과가 나버렸다..

이유는 이중 for문 때문에 시간복잡도가 O(N2)O(N^2) 되버린 것이였다..

틀린 코드..
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        HashMap<String,String> map = new HashMap<>();
        for(int i=1;i<=n;i++){
            String name = br.readLine();
            map.put(name, String.valueOf(i));
        }

        StringBuilder sb = new StringBuilder();
        for(int i=1;i<=m;i++){
            String question = br.readLine();
            if(map.containsKey(question)){
                sb.append(map.get(question)).append("\n");
            }
            else if(map.containsValue(question)) {
                for(String key : map.keySet()) {
                    if(map.get(key).equals(question)){
                        sb.append(key).append("\n");
                        break;
                    }
                }
            }
        }

        System.out.println(sb);
    }
}

해결또한 생각보다 쉬웠다!
기존 HashMap에 key와 value를 반대로 한번 더 저장하면 되는 문제였다.

이후 다른 풀이를 찾아봤는데, 2개의 map을 사용해서 해결한게 대부분이였다.
주어진 N,M이 100,000 이하였기 때문에 map 하나에 다 넣었어도 통과된게 아닌가 싶다.

추가로 나는 숫자와 문자열을 구분하려니 귀찮아질 것 같아서 숫자로 String 취급해 map에다가 저장했었다.

여러 다른 풀이를 찾아보다가 신박한 구분 방법이 있어서 들고와봤다.

	if(isStringNumber(findStr)) { // 숫자(인덱스)를 입력받은 경우
		int index = Integer.parseInt(findStr);
	 	sb.append(nameArr[index]);
	}


	// 이 문자열이 숫자인지 아닌지 판단하는 함수
	public static boolean isStringNumber(String s) {
	   try {
	       Double.parseDouble(s);
	       return true;
	   }
	   catch (NumberFormatException e) {
	       return false;
	   }
	}

이런식으로 문자열인지 숫자인지 확인 가능한 코드도 있었다.
해당 블로그 참조!!

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        HashMap<String,String> map = new HashMap<>();
        for(int i=1;i<=n;i++){
            String name = br.readLine();
            map.put(name, String.valueOf(i));
            map.put(String.valueOf(i), name);
        }

        StringBuilder sb = new StringBuilder();
        for(int i=0;i<m;i++){
            String question = br.readLine();
            if(map.containsKey(question)){
                sb.append(map.get(question)).append("\n");
            }
        }

        System.out.println(sb);
    }
}
profile
공부 정리용

0개의 댓글