백준

[백준/BOJ] 1620번 : 나는야 포켓몬 마스터 이다솜 (JAVA / 자바)

코메인 2022. 3. 7. 23:47

안녕하세요~ 코딩하는 코알못 코메인입니다.

 

 

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

 

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

첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면

www.acmicpc.net


- 문제 -

 

난이도 실버 4 문제이다.

자바에서 입력방식은 scanner와 bufferedreader가 있다.

자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

더 자세한 내용은 아래 글 참고 하면 좋다.

https://comain.tistory.com/3

 

(JAVA / 자바) Scanner 와 Bufferedreader

안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

comain.tistory.com

 

풀이 방법

한마디로 우리가 영단어 공부할때 영단어와 뜻을 적어놓고 양방향으로 맞추기 한것처럼 도감 내용을 기준으로 맞추라는 것이다.

도감에는 입력순서대로 1번부터 N번까지 도감이 입력된다.

1 - 포켓몬 이름

2 - 포켓몬 이름

.

.

.

N - 포켓몬 이름

이렇게 쭉 정해지고, 2가 입력되면 2번에 해당되는 포켓몬의 이름을 출력해주면 된다.

반대로 7번에 있는 포켓몬이 이름이 입력되면 7이 출력되면 된다.

 

HashMap을 만든다. 하지만 Hashmap은 기본적으로 Key에 해당하는 Value값을 뽑아내는 것에 특화되어있고, Value에 맞는 Key값을 뽑아내기는 불가능은 아니지만 번거롭고 이렇게 테스트 케이스가 많을 경우 시간초과가 나올 수 있다.

그렇기때문에 반대로 포켓몬 이름 - 1 식으로 Key에는 이름, Value에는 번호가 저장되게도 하나 더 HashMap을 만들어준다.

그렇게 총 두개의 HashMap을 만들 것이다.

 

이제 문제에대한 입력값을 받을 것인데. 입력값에 포켓몬 이름이 올지 번호가 올지 알 수 없기때문에 String으로 입력값을 받는다.

입력받은 문자열이 숫자인지 아닌지를 확인한다. String.charAt(0)으로 문자열의 첫 인덱스 값을 확인한다. char은 아스키코드로 값을 확인 할 수 있는데, 숫자인 1~9까지의 아스키 코드 값은 49~57이다. String.charAt(0)이 49~57 범위안에 드는 값이면 번호인 것이니 Key가 번호인 HashMap에서 해당 문자열을 Key로 갖는 Value값을 출력해준다.

범위 안에 들지 않는다면 문자열은 포켓몬 이름이라는 것이기 때문에 다른 HashMap에서 문자열을 Key로 갖는 Value값을 출력해준다.

 

출력은 StringBuilder에 저장해서 한번에 출력해준다.

 

코드를 보자.


-풀이-

 

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

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());
		StringBuilder sb = new StringBuilder();
		//조건에 따라 다르게 쓰일 두개의 HashMap
		HashMap<Integer, String> hash1 = new HashMap<Integer, String>();
		HashMap<String, Integer> hash2 = new HashMap<String, Integer>();
		
		
		for(int i = 1; i <= N; i++) {
			String S = br.readLine();
			hash1.put(i, S);
			hash2.put(S, i);
		}
		
		for(int i = 0; i < M; i++) {
			String S = br.readLine();
			//입력값이 번호인지 포켓몬이름인지 판별
			if(49 <= S.charAt(0) && S.charAt(0) <= 57) {
				sb.append(hash1.get(Integer.parseInt(S))).append("\n");
			}else {
				sb.append(hash2.get(S)).append("\n");
			}
		}
		System.out.println(sb);
	}

}

-결과-

 


아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.