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

Ga0·2023년 5월 11일
0

baekjoon

목록 보기
46/125






문제 해석

  • 문제가 너무 길지만, 문제가 요구하는 바는 간단하다.
  • 첫번째 줄에는 도감에 등록되어 있는 포켓몬 개수와(N) 맞춰야 하는 문제의 개수(M)을 입력받는다.
  • 일단, N개의 줄 만큼 포켓몬 이름을 입력받고, N개의 포켓몬 이름을 다 입력받으면, M의 개수만큼 맞춰야할 문제의 숫자 or 포켓몬 이름을 입력받는다.
  • 그리고, 출력은 숫자로 입력받았으면 포켓몬 이름을 출력하고, 포켓몬 이름을 입력받았으면 포켓몬 도감 숫자를 출력한다.

틀린 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken()); //도감에 등록된 포캣몬 개수
        int M = Integer.parseInt(st.nextToken()); // 맞춰야 하는 포켓몬 개수

        HashMap<Integer, String> poketArray = new HashMap<>(); //저장할 포켓몬 도감

        for(int i = 1; i <= N; i++){
            poketArray.put(i, br.readLine());
        }

        for(int i = 0; i < M; i++){
            String pocket = br.readLine();

            for (Map.Entry<Integer, String> pair : poketArray.entrySet()) {
                if(pocket.charAt(0) - 'A' >= 0){ // 이름을 입력 받았으면 -A 했으면 0보다 크거나 같을 것이다.
                    if(pair.getValue().equals(pocket)){
                        bw.write(pair.getKey() + "\n");
                    }
                }else{//0보다 크거나 같지않으면 숫자인 경우이다.
                    if(pair.getKey() == Integer.parseInt(pocket)){
                        bw.write(pair.getValue() + "\n");
                    }
                }
            }
        }

        br.close();
        bw.flush();
        bw.close();
    }
}
  • 코드에 대한 설명은 주석으로 달아두었다.

틀린 결과

  • 하지만, 시간 초과로 틀렸다...

맞은 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        HashMap<Integer, String> poketArray_String = new HashMap<>(); //value가 숫자인
        HashMap<String, Integer> pocketArray_int = new HashMap<>(); //value가 문자열

        for(int i = 1; i <= N; i++){
            String str = br.readLine();
            //두번 다 넣어줘야한다.
            poketArray_String.put(i, str);
            pocketArray_int.put(str, i);
        }

        for(int i = 0; i < M; i++){
            String pocket = br.readLine();
            if(isNum(pocket)){ //숫자이면
                bw.write(poketArray_String.get(Integer.parseInt(pocket)) + "\n");
            }else{
                bw.write(pocketArray_int.get(pocket) + "\n");
            }
        }

        br.close();
        bw.flush();
        bw.close();
    }
    public static boolean isNum(String str) { //숫자 체크 함수(숫자이면 true, 숫자아니면 false)
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
}

맞은 결과

느낀 점

  • keySet() 반복문을 하나 뺐더니 시간 초과 문제를 해결할 수 있었다.
  • 숫자 체크 함수도 따로 빼서 작성했고, keySet()대신 hashMap<String, Integer>과 hashMap<Integer, String>을 따로 주었더니 확실히 keySet() for문을 빼는데 수월했다.

0개의 댓글