12/17 Programmers LV 2

김태준·2022년 12월 17일
0

Coding Test - Programmers

목록 보기
6/29

독감 걸리고 이틀 앓아누웠다..... 올해 들어 참 자주 아픈듯 코로나 때문에 면역력이 떨어졌나..
암튼 이제 정신 좀 차리고 코테 공부 다시 시작!!

1. 문제 풀이

주차 요금 계산 - 2022 카카오 블라인드 채용

import math
def solution(fees, records):
    answer = []
    car_info = {}
    car_time = {}
    # 입력 레코드 분리
    for i in records:
    	# 출입시간, 차량번호, (in,out)여부 분리
        time, car_num, state = i.split()
        # 시간 분으로 처리
        hour, minute = time.split(':')
        now_time = int(hour)*60 + int(minute)
        # In인 경우
        if len(state) == 2:
        	# 차량 정보에 차량번호:입장시간 입력
            car_info[car_num] = now_time
        # Out인 경우
        else:
        	# 주차 시간 기록
            parking_time = now_time - car_info[car_num]
            # 차량 번호 별 시간 기록에 해당 정보 기입
            if car_num not in car_time:
                car_time[car_num] = parking_time
            else:
                car_time[car_num] += parking_time
            # Out 했으니 정보 지우기
            del car_info[car_num]
    # In만 한 경우
    if car_info:
        for car_num in car_info:
        	# 들어온 시간 확인 
            in_time = car_info[car_num]
            # 차량 번호 별 시간 기록에 정보 기입 24시간 - 입장시간
            if car_num not in car_time:
                car_time[car_num] = (1439 - in_time)
            else:
                car_time[car_num] += (1439 - in_time)
   	# 차량 번호 별 시간 기록으로 요금 계산하기
    for car_num in sorted(car_time.keys()):
    	# 총 시간은 차량 시간 디렉토리에 담긴 차량 번호로 확인
        total_time = car_time[car_num]
        pay = fees[1]
        # 단위 시간보다 오래 걸린 경우
        if total_time - fees[0] > 0:
            leftover = total_time - fees[0]
            # 추가요금 계산해서 answer에 append 해주기
            pay += math.ceil(leftover/fees[2])*fees[3]
        answer.append(pay)
    return answer

< 풀이 과정 >
주어진 문제를 잘 읽고 구현해내는 문제. 해결하는데 시간이 좀 걸렸다
차량이 입차, 출차되는 정보를 담은 딕셔너리 car_info와 차량 번호판 기준으로 총 시간 정보를 담은 딕셔너리 car_time 2개를 생성하였다

  • records를 for문으로 돌려 입차든 출차든 현재 시간을 담은 now_time 생성, 이후 입차인 경우 car_info - 차량번호에 현재시간 기입, 출차인 경우 차량이 주차된 시간인 parking_time 변수생성하여 입차 기록이 있으면 +, 아니면 주차시간 저장. 출차 이후 car_info에서 해당 차량 번호 제거해주기
    (이때 주차시간을 저장해주는 이유는 필요한 시간이 출차 시간이 아니기 때문!)

  • 만일 입차기록만 있다면, 차량이 들어왔던 시간을 in_time으로 두고 출차 시간인 (23:59 - 입차한 시간)을 더해준다.

  • 이후 차량 번호 마다 주차요금을 계산하기 위해 for문을 돌렸고 기본요금을 pay로 두었다.
    이후 기본 시간보다 주차된 시간이 크면 pay에 초과 시간 / 단위 시간 * 단위 요금을 더해주어 answer로 출력!

차량 입출차 정보, 차량 번호 당 시간 이렇게 나누어서 생각을 해서 그런지 오래걸렸다.
좀 더 빠르게 문제를 풀 수 있는 접근 방식도 있을 듯!

오픈채팅방 - 2019 카카오 블라인드 채용

def solution(record):
    answer = []
    user_id = {}
    
    for array in record:
        word = array.split()
        if len(word) == 3:
            user_id[word[1]] = word[2]
    
    for array in record:
        word = array.split()
        if word[0] == 'Enter':
            answer.append('%s님이 들어왔습니다.' %user_id[word[1]])
        elif word[0] == 'Leave':
            answer.append('%s님이 나갔습니다.' %user_id[word[1]])
    return answer

< 풀이 과정 >
단순 구현하는 문제!
records 리스트에서 Leave인 경우를 제외한 Enter, Change의 경우 딕셔너리에 {id:닉네임}을 저장해준다. (Change로 시작을 해도 결국 딕셔너리라 최신 값만 저장 된다!)

  • len(word) == 3으로 Leave가 아닌 경우 id:닉네임 저장
  • word[0] = Enter인 경우 ~님이 들어왔습니다 출력
  • word[0] = Leave인 경우 ~님이 나갔습니다 출력

피로도

answer = 0

def search(k, dungeons, count, visited):
    global answer
    if count > answer:
        answer = count
    for i in range(len(dungeons)):
        if k >= dungeons[i][0] and not visited[i]:
            visited[i] = True
            search(k-dungeons[i][1], dungeons, count+1, visited)
            visited[i] = False

def solution(k, dungeons):
    global answer
    visited = [False] * len(dungeons)
    search(k, dungeons, 0, visited)
    return answer

< 풀이 과정 >
탐색을 위해 새로운 함수를 정의해주었다. def search

  • count 가 answer보다 크면 answer = count로 처리
  • 던전 길이만큼 for문을 돌려 피로도가 dungeons[i][0] (던전 돌기 위해 필요한 피로도)보다 크고 방문하지 않은 던전이면 무조건 탐색처리
  • 이후 피로도 - 방문했던 던전의 피로도, 방문한 던전 수 + 1로 다시 search함수 탐색
  • solution 함수내에 search 함수 사용하기 위해 visited = [False]로 생성 이후 answer 리턴
profile
To be a DataScientist

0개의 댓글