알고리즘/백준

<백준> 17219번 : 비밀번호 찾기 (파이썬, JAVA)

흰색텀블러 2024. 8. 1. 09:25

<링크>

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

<문제>

2019 HEPC - MAVEN League의 "비밀번호 만들기"와 같은 방식으로 비밀번호를 만든 경민이는 한 가지 문제점을 발견하였다. 비밀번호가 랜덤으로 만들어져서 기억을 못 한다는 것이었다! 그래서 경민이는 메모장에 사이트의 주소와 비밀번호를 저장해두기로 했다. 하지만 컴맹인 경민이는 메모장에서 찾기 기능을 활용하지 못하고 직접 눈으로 사이트의 주소와 비밀번호를 찾았다. 메모장에 저장된 사이트의 수가 늘어나면서 경민이는 비밀번호를 찾는 일에 시간을 너무 많이 쓰게 되었다. 이를 딱하게 여긴 문석이는 경민이를 위해 메모장에서 비밀번호를 찾는 프로그램을 만들기로 결심하였다! 문석이를 도와 경민이의 메모장에서 비밀번호를 찾아주는 프로그램을 만들어보자.

<입력>

첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다.

두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번호가 공백으로 구분되어 주어진다. 사이트 주소는 알파벳 소문자, 알파벳 대문자, 대시('-'), 마침표('.')로 이루어져 있고, 중복되지 않는다. 비밀번호는 알파벳 대문자로만 이루어져 있다. 모두 길이는 최대 20자이다.

N+2번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소가 한줄에 하나씩 입력된다. 이때, 반드시 이미 저장된 사이트 주소가 입력된다.

<출력>

첫 번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소의 비밀번호를 차례대로 각 줄에 하나씩 출력한다.

<고려 사항>

1. 비밀번호가 "공백"으로 주어진다. -> split을 쓰자!

2. 사이트 주소는 "중복되지 않는다." -> 중복 처리를 할 필요가 없다! (set을 쓸 필요가 없다고 생각)

3. 비밀번호는 "대문자로만" 이루어져있다. -> lower, upper를 고려할 필요가 없다!

4. 반드시 이미 "저장된" 사이트 주소가 입력된다. -> 예외처리를 고려하지 않아도 된다!

 

<풀이 시작 전 생각한 사항>

1. 이메일과 비밀번호가 각각 들어가기 때문에, Python에서 제공하는 dictionary형태를 사용하면 key, value를 쉽게 파악할 수 있을 것이라 생각했다. 또한 고려사항 2번에서 key로 쓰일 "사이트 주소"가 중복되지 않기 때문에, key 중복에 대한 문제도 해결 할 수 있다.

 

<틀린 풀이 법>

N, M = map(int, input().split())
sit = dict()
for _ in range(N):
    si, pa = map(str, input().split())
    sit[si] = pa
for _ in range(M):
    print(sit[si])

 

틀린 이유 : 첫 for 문에 썼던 si 변수를 두번째 for문에 써서... si 가 정의되지 않은 상태로 실행을 해버렸다..

<맞춘 풀이 법 - Python>

N, M = map(int, input().split())
sit = dict()
for _ in range(N):
    si, pa = map(str, input().split())
    sit[si] = pa
site = []
for _ in range(M):
    site.append(input())
for i in site:
    print(sit[i])

 

코드 진행 순서

1. N과 M을 동시에 받아 온다

2. dictionary를 담고 있는 변수 하나를 생성한다

3. for 문을 통해, 이메일(si)와 비밀번호(pa)를 문자로 받아온다

4. dictionary의 특징을 통해 sit[key] = value (sit[si] = pa)로 값을 할당한다.

5. 빈 리스트를 하나 생성한다.

6. 찾을 이메일에 대한 값을 찾기 위해 site에 값을 추가한다 (append 활용)

7. site에 있을 값들을 for문을 통해 출력한다.

 

<맞춘 풀이 법 - Java>

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        scanner.nextLine();

        HashMap<String, String> sit = new HashMap<>();

        for (int i = 0; i < N; i++) {
            String si = scanner.next();
            String pa = scanner.next();
            sit.put(si, pa);
            scanner.nextLine(); 
        }

        for (int i = 0; i < M; i++) {
            String site = scanner.nextLine();
            System.out.println(sit.get(site));
        }

        scanner.close();
    }
}

 

 

 

이상 제가 약 15분 소요하여 푼 문제 해설이었습니다!

질문 사항은 댓글에 남겨주시면 답변 드리겠습니다!!

 

 

 

'알고리즘 > 백준' 카테고리의 다른 글

<백준> 2252번 줄세우기  (1) 2024.09.05
<백준> 3109번 빵집  (2) 2024.09.04
<백준> 10815번 : 숫자 카드  (0) 2024.08.18
<백준> 11653번 : 소인수분해 (파이썬)  (0) 2024.08.02
<백준> 2581번 : 소수 (파이썬)  (0) 2024.08.02