728x90

20240410 백준 파이썬 공부
20920번 영단어 암기는 괴로워

1. 문제
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 
그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 
화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.

1) 자주 나오는 단어일수록 앞에 배치한다.
2) 해당 단어의 길이가 길수록 앞에 배치한다.
3) 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 
화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.

2. 입력
첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. 
(1 <= N <= 100,000, 1 <= M <= 10)

둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 
이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다.
단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.

3. 출력
화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.

>>>코드

import sys
word = {} # 단어와 입력된 횟수를 저장할 딕셔너리 생성
n, m =  map(int, input().split()) # n, m 입력받기
for _ in range(n):
    w = sys.stdin.readline().strip() # 단어 입력받기
    if len(w) >= m and w in word: # 단어의 길이가 m 이상이고, word 딕녀너리 안에 존재
        word[w] += 1 # 해당 단어의 입력된 횟수 +1
    elif len(w) >= m and w not in word: # 단어의 길이가 m 이상이고, word 딕녀너리 안에 존재하지 않음
        word[w] = 1 # 해당 단어 생성
# 조건에 맞게 정렬한 리스트 생성(1. 입력된 횟수 내림차순, 2. 단어의 길이 내림차순, 3. 알파벳순 오름차순)
result = sorted(list(word.keys()), key = lambda x: (-word[x], -len(x), x))
# 순서대로 출력
print(*result, sep = "\n")



>>> 코드 해설

1) sorted(리스트, key = lambda x: (정렬 조건1, 정렬 조건2, ..))
- 리스트를 정렬 조건에 따라 순서대로 정렬하는 함수
- 정렬 조건에는 x(사전순서 or 숫자순서), len(x)(단어의 길이) 등등이 올수 있으며, 
그냥 쓰면 오름차순, 앞에 "-" 를 붙이면 내림차순이 된다

2) 딕셔너리.keys()
- 딕셔너리에서 key들을 반환하는 함수
- list()안에 사용해주면 해당 딕셔너리의 key들을 리스트에 반환해준다.

3) 딕셔너리.values()
- 딕셔너리에서 value들을 반환하는 함수
- list()안에 사용해주면 해당 딕셔너리의 value들을 리스트에 반환해준다.


>>>문제링크
https://www.acmicpc.net/problem/20920

728x90
728x90

20240407 백준 파이썬 공부
1620번 나는야 포켓몬 마스터 이다솜

1. 문제

<생략>

2. 입력
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. 
N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 
모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어.

둘째 줄부터 N개의 줄에 
포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 
포켓몬의 이름은 모두 영어로만 이루어져있고, 
또, 음... 첫 글자만 대문자이고, 나머지 문자는 소문자로만 이루어져 있어. 
아참! 일부 포켓몬은 마지막 문자만 대문자일 수도 있어. 
포켓몬 이름의 최대 길이는 20, 최소 길이는 2야. 
그 다음 줄부터 총 M개의 줄에 내가 맞춰야하는 문제가 입력으로 들어와. 
문제가 알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 
숫자로만 들어오면, 포켓몬 번호에 해당하는 문자를 출력해야해. 
입력으로 들어오는 숫자는 반드시 1보다 크거나 같고, N보다 작거나 같고, 
입력으로 들어오는 문자는 반드시 도감에 있는 포켓몬의 이름만 주어져. 그럼 화이팅!!!

2. 출력
첫째 줄부터 차례대로 M개의 줄에 각각의 문제에 대한 답을 말해줬으면 좋겠어!!!. 
입력으로 숫자가 들어왔다면 그 숫자에 해당하는 포켓몬의 이름을,
문자가 들어왔으면 그 포켓몬의 이름에 해당하는 번호를 출력하면 돼. 그럼 땡큐~

<그림>
이게 오박사님이 나에게 새로 주시려고 하는 도감이야. 너무 가지고 싶다ㅠㅜ. 
꼭 만점을 받아줬으면 좋겠어!! 파이팅!!!

>>> 코드

import sys
n, m = map(int, input().split())
pokemon1, pokemon2 = {}, {}
for i in range(n):
    name = sys.stdin.readline().strip()
    pokemon1[i] = name
    pokemon2[name] = i
for i in range(m):
    s = input()
    if s.isdigit() == True:
        print(pokemon1[int(s)-1])
    else:
        print(pokemon2[s]+1)



>>>코드 해설

1) isdigit()
- "판단하고 싶은 문자열".isdigit()
- 입력받은 문자열이 "숫자"로만 이루어져 있는지 확인하는 함수
- 만약 문자가 단 하나라도 있으면 False 반환
- 만약 모든 문자가 숫자로만 이루어져 있으면 True 반환

>>>문제링크
https://www.acmicpc.net/problem/1620

728x90
728x90

20240406 백준 파이썬 공부
17219번 비밀번호 찾기

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

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

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

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

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

>>>코드1. input()을 사용

n, m = map(int, input().split())
search= {}
for _ in range(n):
    key, value = input().split()
    search[key] = value
for _ in range(m):
    key = input()
    print(search[key])



>>>코드2. sys.stdin.readline()사용

import sys
n, m = map(int, sys.stdin.readline().split())
search= {}
for _ in range(n):
    key, value = sys.stdin.readline().split()
    search[key] = value
for _ in range(m):
    key = sys.stdin.readline().strip()
    print(search[key])


>>> 알아야하는 점
sys.stdin.readline()은 개행문자(\n)을 포함하기 때문에
개행문자나 공백이 중복되는 경우 .strip()을 붙여 개행문자를 없애주어야한다.

- rstrip(): 오른쪽 공백 삭제
- lstrip(): 왼쪽 공백 삭제
- strip(): 양쪽 공백 삭제

>>>문제링크
https://www.acmicpc.net/problem/17219

728x90

+ Recent posts