반응형
1. 문제 - 프로그래머스 가장 많이 받은 선물
https://school.programmers.co.kr/learn/courses/30/lessons/258712
✅ 풀이
from collections import defaultdict
def solution(friends, gifts):
present_count = defaultdict(int)
dic1 = defaultdict(dict) # 선물을 준 기록 딕셔너리 (value는 {받은 사람: 선물 준 횟수} )
dic2 = {} # 각 프렌즈마다 준 선물, 받은 선물 갯수를 기록하는 딕셔너리 --> 이후 선물지수 계산
for friend1 in friends:
for friend2 in friends:
if friend1 != friend2:
dic1[friend1][friend2] = 0
dic2[friend1] = [0, 0] # 처음부터 각각 준 횟수, 받은 횟수
for gift in gifts:
giver, receiver = gift.split()
dic1[giver][receiver] += 1 # 주고 받은 선물 기록
dic2[giver][0] += 1 # 선물 준 횟수 기록
dic2[receiver][1] += 1 # 선물 받은 횟수 기록
for friend1 in friends:
for friend2 in dic1[friend1].keys():
if dic1[friend1][friend2] > dic1[friend2][friend1]: # friend1가 friend2보다 선물을 더 많이줬으므로 + 1
present_count[friend1] += 1
elif dic1[friend1][friend2] == dic1[friend2][friend1]: # 기록이 하나도 없거나 주고받은 수가 같다면
friend1_present_num = dic2[friend1][0] - dic2[friend1][1] # 선물 지수를 계산하여 비교
friend2_present_num = dic2[friend2][0] - dic2[friend2][1]
if friend1_present_num > friend2_present_num: # friend1의 선물지수가 더 높다면 friend2로부터 선물 하나 더 받음
present_count[friend1] += 1
friends_gift_counter = list(present_count.values())
return max(friends_gift_counter) if friends_gift_counter else 0
2. 문제 - 프로그래머스 달리기 경주
https://school.programmers.co.kr/learn/courses/30/lessons/178871
✅ 풀이
def solution(players, callings):
player_rank = {} # key-value: 선수-순위
rank_player = {} # key-value: 순위-선수
for i, player in enumerate(players):
player_rank[player] = i + 1
rank_player[i+1] = player
for call in callings:
call_rank = player_rank[call] # 불린 말의 현재 순위
former = rank_player[call_rank-1] # 앞 플레이어
former_rank = call_rank - 1 # 앞 플레이어 순위
# 순서 바꾸기
player_rank[call], player_rank[former] = player_rank[former], player_rank[call]
rank_player[former_rank], rank_player[call_rank] = rank_player[call_rank], rank_player[former_rank]
return sorted(player_rank.keys(), key=lambda x:player_rank[x])
✅ 다른사람 풀이
def solution(players, callings):
pla_dic = {key: i for i, key in enumerate(players)}
for p in callings:
c = pla_dic[p] # 말의 현재 순위
pla_dic[p] -= 1 # 추월하므로 말의 현재순위를 1 앞당김
pla_dic[players[c-1]] += 1 # 추월된 말의 순위를 1 후진
players[c-1], players[c] = players[c], players[c-1] # 말끼리 순위대로 순서바꾸기
return players
* list.index(element)를 사용해서 그때그때 순위를 알아낼 수도 있지만, players의 길이가 최대 50,000 이기 때문에 시간초과 발생한다.
따라서 딕셔너리를 통해 인덱스 관리
3. 문제 - 프로그래머스 주차 요금 계산
https://school.programmers.co.kr/learn/courses/30/lessons/92341
✅ 풀이
from collections import defaultdict
import math
def solution(fees, records):
# fees: 차례대로 기본 시간, 기본 요금, 단위 시간, 단위 요금
basic_time, basic_fee, unit_time, unit_fee = fees
record_dic = {} # IN - OUT 기록하기 위한 딕셔너리
time_dic = defaultdict(int) # 차량번호별로 시간 기록하는 딕셔너리
def calculate_time(in_time, out_time): # 시간 계산하는 함수
in_time = in_time.split(":")
out_time = out_time.split(":")
hour = int(out_time[0]) - int(in_time[0])
minute = int(out_time[1]) - int(in_time[1])
if minute < 0:
minute += 60
hour -= 1
return hour * 60 + minute
for record in records:
time, number, command = record.split()
if command == "IN":
record_dic[number] = time
else: # 출차할 경우 시간 계산 후 time_dic에 추가
time_dic[number] += calculate_time(record_dic[number], time)
del record_dic[number]
for (number, in_time) in record_dic.items(): # 출차되지 않은 차들은 23:59 out으로 침
time_dic[number] += calculate_time(in_time, "23:59")
list_time_dic = sorted(time_dic.items(), key=lambda x:x[0]) # 차량 번호가 작은 순서부터 계산하기 위해 먼저 key 기준으로 정렬
answer = []
for _, time in list_time_dic:
if time <= basic_time:
answer.append(basic_fee)
else:
fee = basic_fee + math.ceil((time - basic_time) / unit_time) * unit_fee
answer.append(fee)
return answer
오늘 배운 점
1. python의 기본값을 가지는 딕셔너리로 초기화
from collections import defaultdict
list1 = defaultdict(int)
list2 = defaultdict(list)
list3 = defaultdict(dict)
2. Python의 키값 목록, value값 목록, (key, value) 목록은 다음과 같으며, 배열로 사용하고자 할 때 반드시 list를 붙여 배열화한다.
dic.keys()
dic.values()
dic.items()
list(dic.keys())
3. 딕셔너리도 컴프리헨션을 통해 초기화할 수 있다.
pla_dic = {key: i for i, key in enumerate(players)}
4. 배열도 언패킹이 가능하다.
a, b, c, d = lst
5. 소수에 int를 씌워서 정수화하면 소수점 이하를 다 버린다. 올리려면 import math / math.ceil(i) 메서드를 활용하자
반응형
'⚙️ 알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 백준 5052, 프로그래머스 성격 유형 검사하기, 백준 13459 (0) | 2025.05.24 |
---|---|
[Python] 프로그래머스 기둥과 보 설치 (0) | 2025.05.20 |
[Python] 프로그래머스 이진 변환 반복하기, 롤케이크 자르기 (0) | 2025.05.18 |
[Python] 백준 2206, 백준 14442 (벽 부수고 이동하기 1, 2) (0) | 2025.05.16 |
[Python] 백준 11559, 프로그래머스 프렌즈4블록, 백준 13460 (0) | 2025.05.14 |