문제
2019 HEPC - MAVEN League의 "비밀번호 만들기"와 같은 방식으로 비밀번호를 만든 경민이는 한 가지 문제점을 발견하였다. 비밀번호가 랜덤으로 만들어져서 기억을 못 한다는 것이었다! 그래서 경민이는 메모장에 사이트의 주소와 비밀번호를 저장해두기로 했다. 하지만 컴맹인 경민이는 메모장에서 찾기 기능을 활용하지 못하고 직접 눈으로 사이트의 주소와 비밀번호를 찾았다. 메모장에 저장된 사이트의 수가 늘어나면서 경민이는 비밀번호를 찾는 일에 시간을 너무 많이 쓰게 되었다. 이를 딱하게 여긴 문석이는 경민이를 위해 메모장에서 비밀번호를 찾는 프로그램을 만들기로 결심하였다! 문석이를 도와 경민이의 메모장에서 비밀번호를 찾아주는 프로그램을 만들어보자.
입력
첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다.
두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번호가 공백으로 구분되어 주어진다. 사이트 주소는 알파벳 소문자, 알파벳 대문자, 대시('-'), 마침표('.')로 이루어져 있고, 중복되지 않는다. 비밀번호는 알파벳 대문자로만 이루어져 있다. 모두 길이는 최대 20자이다.
N+2번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소가 한줄에 하나씩 입력된다. 이때, 반드시 이미 저장된 사이트 주소가 입력된다.
출력
첫 번째 줄부터 M개의 줄에 걸쳐 비밀번호를 찾으려는 사이트 주소의 비밀번호를 차례대로 각 줄에 하나씩 출력한다.
풀이
처음에 생각했던 방식은 사실 2차원 배열을 만들어서 [n][0]에 사이트 주소를 저장하고 [n][1]에 비번을 저장할 생각이었다.
결론적으로는 맞는 값들이 나오긴 했지만... 시간 초과가 떠서 어떤 방식으로 푸는게 좋을까... 하고 알아보다가 딕셔너리를 사용하라는 걸 찾아서 이번에 처음으로 딕셔너리를 사용해보았다!
https://devinside.tistory.com/161 참고했던 사이트.
사실 list로 해놨던 거만 dict로 바꿔놓으면 되는거라 그렇게까지 어렵진 않았고, 나머지 아이디어들은 그대로 가지고 갔다.
1. 사이트 주소 수 N만큼 데이터를 입력 받고 저장
2. 비밀번호 M 입력 받은 값(사이트 주소)와 해당하는 동일한 key값을 가진 value값을 result에 저장
3. result 출력
import sys
data = sys.stdin.readline().split()
n = int(data[0])
m = int(data[1])
dict = {}
for i in range(0,n):
site = sys.stdin.readline().split()
dict[site[0]] = site[1]
result = []
for i in range(m):
b = input()
result.append(dict[b])
print("\n".join(result))
시행착오
사실 딕셔너리로 하기 전, 그러니까 아무것도 알아보지 않고 문제만을 보고 혼자 했을때는 list로 해결하려해서 2차원 배열 만드는 법을 찾아보기도 했다.
import sys
data = sys.stdin.readline().split()
n = int(data[0])
m = int(data[1])
pw = [[0 for _ in range(2)] for _ in range(n)]
for i in range(0,n):
site = sys.stdin.readline().split()
pw[i][0] = site[0]
pw[i][1] = site[1]
result = []
for i in range(m):
b = sys.stdin.readline().split()
for j in range(n):
if pw[j][0] == b[0]:
result.append(pw[j][1])
break
print("\n".join(result))
pw라는 2차원 배열을 만들고 그 곳을 0으로 채운 다음에, 0번째 열에 주소를 저장, 1번째 열에 비번을 저장하는 방식으로 코드를 짰었다.
시간초과가 떠서 딕셔너리로 바꾸긴 했지만...
좀 이건 웃겨서 넣는 말인데, 두번째 for문을 해결하고 있을때 (for i in range(m)) 아무리 값을 넣어도 결과가 나오질 않아서 당황했었다. 그건 다름아닌... sys.stdin.readline().split()으로 받은 b값을 b[0]으로 하고 있는게 아니라 그냥 b로 찾고 있었기 때문... 바보 같았지만, 다음에는 이런 사소한 걸로 당황하지 않기 위해... 그리고 알게 됐을때 너무 어이없고 웃겼어서 추가로 적는다. 그리고 무엇보다 이런 경우에서는 그냥 input()으로 받는게 더 효율적인 것 같다.
'백준 알고리즘' 카테고리의 다른 글
[python] 백준 2164. 카드2 (0) | 2024.11.10 |
---|---|
[python] 백준 1620. 나는야 포켓몬 마스터 이다솜 (2) | 2024.11.09 |
[python] 백준 11047. 동전 0 (4) | 2024.11.07 |
[python] 백준 1764. 듣보잡 (2) | 2024.11.06 |
[python] 백준 11723. 집합 (0) | 2024.11.06 |