반응형
프로그래머스 풀이
문제리뷰
2022 KAKAO BLIND RECRUITMENT
- 신고 결과 받기 : 파이썬 딕셔너리 활용해서 풀어봤는데 value 값을 딕셔너리형로 받아서 코딩하는 내가 헷갈렸다^^
또한, 제한 사항, 문제 요구 사항을 제대로 읽고 파악해야 시간을 안 버릴거 같다.
그리고 자료형을 id : {신고한 id : T/F} 로 표현했는데 신고한 사람을 리스트로 넣어도 될거 같다. - 주차 요금 계산 : 차량 번호별 시간 값을 딕셔너리 형태로 만든 후, 총 시간 개수가 홀수이면 마지막에 23:59를 넣어 예외 처리를 따로 안 해도 계산 할 수 있도록 함.
문제 분석
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리
- 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성
- 처음에는 유저별 신고 횟수를 구하는걸로 잘못 이해해서 return함
- key, value가 한 쌍인 자료구조 : 해쉬(파이썬에서는 딕셔너리)가 필요함
신고 결과 받기
초기 코드
check_list 구조 : {id : {id가 신고 때린 사람 : 신고를 때렸는지 아닌지 True/False}}
count_list 구조 : {id : 신고 받은 횟수}
answer 구조 : {id : 메일 보낸 자 카운팅}
def solution(id_list, report, k):
temp = { id : False for id in id_list }
check_list = { id : temp.copy() for id in id_list }
# id : {신고한 id : T/F}
for element in report:
_from, to = element.split()
check_list[_from][to] = True
count_list = { id : 0 for id in id_list }
for _from in id_list:
cur = check_list[_from]
for key, value in cur.items():
if value: count_list[key] += 1
answer = { id : 0 for id in id_list }
for id in id_list:
if count_list[id] >= k:
for key, value in check_list.items():
if value[id]: answer[key] += 1
answer = list(answer.values())
return answer
강의 본 후 수정 풀이
굳이 T/F로 신고 때린 사람 관리하는 것보다 set으로 관리해서 중복을 없애면 되겠다고 생각했다.
-> 해설 강의를 보니 그냥 처음부터 report를 set 처리하면 더 간단하다(머쓱)
check_list 구조 : {id : set(신고 때린 사람)}
count_list 구조 : {id : 신고 받은 횟수}
answer 구조 : [id 순서대로 mail 보낸 횟수]
def solution(id_list, report, k):
check_list = { id : set() for id in id_list }
for element in report:
_from, to = element.split()
check_list[_from].add(to)
count_list = { id : 0 for id in id_list }
for _from in id_list:
cur = check_list[_from]
for stop_name in cur:
count_list[stop_name] += 1
# check_list : { id : [신고한 사람] }
# count_list : { id : 신고 횟수}
# answer : { id 순으로 메일 횟수 }
answer = []
for name in id_list:
mail = 0
for user in check_list[name]:
if count_list[user] >= k:
mail += 1
answer.append(mail)
return answer
주차 요금 계산
초기 코드
- 차량번호별 시간 구하기
- 시간 값을 분으로 바꾼 후 전체 요금 구하기
from collections import defaultdict
import math
def solution(fees, records):
btime, bfee, utime, ufee = fees
# 차량번호 : [시간]
totalTimes = defaultdict(list)
for record in records:
time, number, state = record.split(' ')
totalTimes[number].append(time)
totalTimes = sorted(totalTimes.items())
# 전체 요금 계산
answer = []
for key, values in totalTimes:
if(len(values) % 2 == 1): values.append('23:59')
total = bfee
totalTime = 0
for idx in range(0, len(values), 2):
inTime = values[idx].split(":")
inTime = int(inTime[0]) * 60 + int(inTime[1])
outTime = values[idx + 1].split(":")
outTime = int(outTime[0]) * 60 + int(outTime[1])
totalTime += outTime - inTime
if(totalTime >= btime):
total += math.ceil((totalTime - btime) / utime) * ufee
answer.append(total)
return answer
강의 본 후 참고 사항
강의에서는 차량 번호를 배열 인덱스로 사용하고 inTime, 들어오고 나갔는지 여부, 누적 시간을 배열로 만들어서 관리했다.
내 풀이가 더 간단한거 같아서 강의만 참고했다.
반응형
'Problem Solving > 문제풀이' 카테고리의 다른 글
기타:: 230211 일기 (0) | 2023.02.11 |
---|---|
기타:: 230208 일기 (0) | 2023.02.09 |
기타:: 230131 일기 (0) | 2023.01.31 |
기타:: 230124 일기 (0) | 2023.01.24 |
기타:: 230118 일기 (0) | 2023.01.18 |