개발일기

백준 1620 포켓몬 문제 본문

Algorithm/집합과 맵

백준 1620 포켓몬 문제

한둥둥 2022. 11. 21. 18:23

https://www.acmicpc.net/problem/1620

이 문제를 풀면서 우선적으로 문자열인지 숫자인지 정답을 입력할 때 판단해야하는 소스코드를 작성을 하여야 한다고 생각했고 이 부분을 정규 표현식을 사용하여 숫자인 경우, 숫자가 아닌 경우로 나누어 주었다. 

또한 이럴 경우 HashMap에서 키값을 가져와주어야 하는데 이때 키값을 가져오는 방법은 함수를 통해서 편하게 가져올 수 있지만 키 값이 아닌 value값을 가져오려면 entrySet을 사용해주어야 하는데 이는 제한 시간을 넘길 것이다.

그렇다면 어떻게 해주어야 하는가? 바로 HashMap을 두 개를 만들어 하나는 이름으로 번호를 찾는, 또 다른 하나는 번호로 이름을 찾을 수 있도록 선언해주어야 한다.  또한 HashMap이 아니더라도 하나는 HashMap, 다른 하나는 배열로 이를 해결 해줄 수 있음. 어쨋든 배열이 2개있어야함.  

내가 푼 문제 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;


public class Baekjoon1620 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuffer sb = new StringBuffer();
        int inputNum = Integer.parseInt(st.nextToken());
        int answerNum = Integer.parseInt(st.nextToken());

        HashMap<String,Integer> hashMap1 = new HashMap<>();
        HashMap<Integer,String> hashMap2 = new HashMap<>();
        int pokemonNumber = 1;
        for(int i=0;i<inputNum;i++){
            String pokemonName = br.readLine();
            hashMap1.put(pokemonName,pokemonNumber);
            hashMap2.put(pokemonNumber,pokemonName);
            pokemonNumber++;
        }
        for(int i = 0; i< answerNum; i++){
          String answer = br.readLine();
          boolean flag = answer.matches("^[0-9]*$");
          if(flag){
                sb.append(hashMap2.get(Integer.parseInt(answer))).append("\n");
          }else{
                sb.append(hashMap1.get(answer)).append("\n");
            }
        }
        System.out.println(sb);
    }
}

다른 사람이 푼 해답 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Baekjoon1620OthAns {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuffer sb = new StringBuffer();
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        String [] arr = new String[N+1];
        HashMap<String,Integer> hashMap= new HashMap<>();
        
        for(int i=1;i<=N;i++){
            arr[i] = br.readLine();
            hashMap.put(arr[i],i);
        }
        for(int i=0;i<M;i++){
            String str = br.readLine();
            if(isNumber(str)){
                sb.append(arr[Integer.parseInt(str)]).append("\n");
            }else{
                sb.append(hashMap.get(str)).append("\n");
            }
        }
        System.out.println(sb);
    }

    private static boolean isNumber(String str){
        try{
            Double.parseDouble(str);
            return true;
        } catch(NumberFormatException e){
            return false;
        }
    }
}

'Algorithm > 집합과 맵' 카테고리의 다른 글

(백준)14425번 문자열 집합  (1) 2022.11.21