Algorithm/baekjoon

[algorithm] hash 백준17219 비밀번호 찾기

dani0312 2024. 2. 10. 23:29

◾문제

비밀번호 찾기

레벨: 실버4

유형: 해시

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

 

 

◾풀

해시에 대한 개념을 알고 있다면 어렵지 않게 풀 수 있는 문제이다. 

 

문제이해

문제가 길지만 문제 길이에 비하여 풀이는 간단한 문제이다. 사이트와 비밀번호를 쌍으로 저장하고, 주어지는 사이트들에 대한 비밀번호를 출력하면 된다.   

 

 

HashMap 사용하기

문제에서 사이트 - 비밀번호라는 정보를 '쌍'으로 저장해두고, 사이트가 주어질 때 해당하는 비밀번호를 찾아 출력해주면 된다. 이는 Map을 활용하면 제격이다. Map인터페이스를 구현한 구현체인 hashMap을 활용하여 이 문제를 쉽게 풀 수 있다. 

 

 

Map선언하기

hshMap은 키(key)와 값(value)을 쌍으로 저장하는 자료구조이다. 사이트주소, 비밀번호를 쌍으로 저장해야 하고 또 하나의 쌍에서 하나의 정보로 다른 정보를 꺼내야하므로 이 hashMap자료구조를 이용한다. 이 문제에서는 사이트 주소, 비밀번호 모두 문자열 형태이므로 모두 String 타입으로 선언해준다.

 

💡Map<key의 타입, value의 타입>

Map<String,String> map = new HashMap<>();

 

 

문자열 저장하기

'사이트 주소 비밀번호' 형태의 문자열로 들어오는 정보를 StringTokenizer를 이용하여 map에 `put`메서드를 이용하여 저장한다. 참고로 StringTokenzier를 사용 시 공백의 경우 `new StringTokenizer(br.readLine()," ")`와 같이 구분자를 따로 선언하지 않아도 아래처럼 생략할 수 있다. 

StringTokenizer st = new StringTokenizer(br.readLine());
map.put(st.nextToken(), st.nextToken());

 

 

값 꺼내기

map에서 get메서드에 key값을 넣으면 value값을 얻을 수 있다. 우리는 사이트주소(key)를 통해 비밀번호(value)를 얻고 싶으므로 `map.get(사이트주소)`와 같이 선언하여 비밀번호를 출력한다.

            bw.write(map.get(br.readLine())+"\n");

 

 

 

◾정답코드

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));

        String[] arr = br.readLine().split(" ");
        int listNum = Integer.parseInt(arr[0]);
        int findNum = Integer.parseInt(arr[1]);

        Map<String, String> map = new HashMap<>();

        while (listNum-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            map.put(st.nextToken(), st.nextToken());
        }
        while (findNum-- > 0) {
            bw.write(map.get(br.readLine())+"\n");
        }
        bw.flush();
        bw.close();
    }
}