jh.nrtv

[코테 문제풀이]Programmers-2022 KAKAO BLIND RECRUITMENT- k진수에서 소수 개수 구하기, 주차 요금 계산, 신고 결과 받기 / Python 풀이 본문

코테 문제풀이

[코테 문제풀이]Programmers-2022 KAKAO BLIND RECRUITMENT- k진수에서 소수 개수 구하기, 주차 요금 계산, 신고 결과 받기 / Python 풀이

wlgus3 2023. 11. 3. 21:28

프로그래머스에서 '2022 KAKAO BLIND RECRUITMENT ' 기출문제를 풀고 기록한 글이다.

허접한 풀이지만 누군가에게 도움이 되길 바라며!

 

✅ k진수에서 소수 개수 구하기

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

35분

문제설명 

정수 n을 k진법으로 만들고 그 안에 조건에 맞는 소수가 몇개인지 반환

<조건>

풀이


조건읽은 후 n을 k진법으로 만든 이후에 0으로 split하고 소수를 판별하는 문제구나! 라고 파악해야 함
풀이 순서 :
 1. 소수판별 함수 필요

 2.n을 k진수로 바꾸기 

 3.'0'기준으로 split하고 

 4.순회하면서 소수여부 판별

 

 

정답코드

# 1000~1034
import math
def solution(n, k):
    # 정수 n을 k진법으로 만들고 그 안에 조건에 맞는 소수가 몇개인지 반환
    # 조건읽은 후 n을 k진법으로 만든 이후에 0으로 split하고 소수를 판별하는 문제구나! 라고 파악해야 함
    
    # 1. 소수판별 함수 필요 2.n을 k진수로 바꾸기  3.'0'기준으로 split하고  4.순회하면서 소수여부 판별
    
    def isPrime(n):
        print(n)
        if n==1:
            return False
        for z in range(2,int(math.sqrt(n))+1): #2~제곱근까지만 순회 -> !!!주의 int(math.sqrt(n))+1 형태로 최종형태가 int가 되도록 해야함
            if n%z==0: #나누어 떨어지면
                return False
        return True
    
    pointer=1
    klist=[] #k의 배수모음 리스트
    while pointer <=n:
        klist.append(pointer)
        pointer*=k
    
    knumber=''  #k진수 담을 변수
    tmpn=n  #임시n
    for i in range(len(klist)): #k진수 구하기
        if klist[-(i+1)]<=tmpn:
            tmp=math.floor(tmpn/klist[-(i+1)])
            knumber+=str( tmp)
            tmpn=tmpn%klist[-(i+1)]
        else:
            knumber+='0'
    

    arr= knumber.split('0') #'0' 으로 끊어서 배열에 담고

    answer = 0
    for j in arr:
        if j!='':   #만약 요소가=='' 라면 그냥 넘어간다.
            if isPrime(int(j))==True:
                answer+=1

    
    return answer

 

 

 


 

 주차 요금 계산

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1시간 30분

문제설명 

요금표 fees 와 입출차기록 records 를 받고 각 차의 요금을 result=[...]로 반환

요금표 fees=[기본시간,기본요금,단위시간,단위요금]
출입차기록 records=["입차시간 차번호 입출입여부","05:34 5961 IN","06:34 0000 OUT"... ]

단, 아래 조건 충족해야함

return = [요금1, 요금2 , ...] 주차번호가 작은 차부터 금액 정리해서 반환
입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산

풀이


복잡해보이지만 결국 구현문제 -> 하지만 세세하게 고려해야 할 조건이 매우 많아서 까다로웠다.

1. records 순회하면서 입차인지, 출차인지 판단 후에

2. 차의 번호를 key로 입차라면 입차시간 dictionary에 입차시간 기록, 출차라면 차의 누적 사용시간을 기록한다.

3. 요금 계산하는 calcfee() 함수 만들어서 차 번호마다 요금 계산해서 반환하도록 함

 

주의
조건을 면밀하게 읽고 세부적인 내용까지 모두 기록한 후에 코드를 짰어야 했음 -> 잘못된 조건으로 짜기 시작해서 돌아가서 고치느라 시간을 많이 씀
나는 한 번 입차, 출차한 차는 다시 못들어온다고 생각하고 코드를 짰으나, 여러 번 왕복 가능하며 
나갈때마다 계산이 아닌 하루동안 이용시간을 총 시간으로 해서 기본시간과의 비교를 통해 요금을 산정한다.

 

정답코드

import math
def solution(fees, records):
    [stdtime,stdfee,addtime,addfee]=fees
    
    obj={}  #입차시간 기록할 오브젝트
    statusobj={}    #차의 상태 인아웃 기록할 오브젝트
    intervalobj={}  #차가 얼마나 사용했는지 누적할 오브젝트 
    
    def calcfee(usetime):  #시간을 주면 요금을 리턴하는 함수 선언
        if usetime<=stdtime:    #기본사용시간 내
            return stdfee
        else:   #기본사용시간 초과
            times= math.ceil((usetime-stdtime)/addtime)
            caledfee=stdfee+(times)*addfee
            return caledfee

    for r in records:   
        [time,carnum,status]=r.split(' ')
        # !! 입장시 조건이 까다로움. 아예 obj에 없거나, 이미 아웃처리되었지만 다시 온 경우 모두를 고려해야 함)
        if carnum not in obj or (carnum in intervalobj and statusobj[carnum]=='OUT') :   
            obj[carnum]= time
            statusobj[carnum]=status
        else:   #퇴장시
            whenin=obj[carnum]
            tmplist=list(map(int,whenin.split(':')))
            intime=tmplist[0]*60+tmplist[1]
            tmplist2=list(map(int,time.split(':')))
            outtime=tmplist2[0]*60+tmplist2[1]
            interval=outtime-intime #차가 머무른 시간 ->입장, 퇴장시간을 분 단위로 계산 후 차이 계산
            if carnum not in intervalobj:   # 기록된 사용시간 없다면  =
                intervalobj[carnum]= interval
            else:                       # 이미 사용시간 기록되어있다면 + 
                intervalobj[carnum]+= interval
            statusobj[carnum]=status
    # print(obj)
    
    keys= sorted(list(obj.keys()))  #차 번호 오름차순으로 출력하기 위해 키값만 리스트로
    # print(keys)
    answer = []
    
    for k in keys:
        if statusobj[k]=='IN': #차의 상태가 'IN'이라면 입차는 했으나 아직 출차 처리가 되지않아 사용시간이 누적되지 않은 상태 -> 누적해야함
            whenin=obj[k]
            tmplist=list(map(int,whenin.split(':')))
            intime=tmplist[0]*60+tmplist[1]
            interval=23*60+59-intime   #23:59에 출차 가정했을 때 사용시간
            if k in intervalobj:    # !!! 여기서도 이미 기록된 사용시간이 있는지 여부를 판단하고 + 인지 = 인지를 분기해야한다.
                intervalobj[k]+=interval
            else:intervalobj[k]=interval
            
        if k in intervalobj:
            answer.append(calcfee(intervalobj[k]))

        else:
            whenin=obj[k]
            tmplist=list(map(int,whenin.split(':')))
            intime=tmplist[0]*60+tmplist[1]
            interval=23*60+59-intime   #23:59에 출차 가정했을 때 사용시간
            answer.append(calcfee(interval))
            
    return answer

 

 

 

 

 


 

 신고 결과 받기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명 

id_list=[name,name2,name3...] 최대1000개

report=['누가신고 누구를신고',''...] 최대200,000 / k=제한신고기준 최대200
유저별 처리결과 메일(신고받은사람이 정지 될 시) 받은 횟수를 [] 담아 리턴 -> id_list 순서대로 

신고는 한명씩 계속 신고 가능하나, 동일한유저 신고는 1회로 처리
k이상 신고-> 정지 -> 메일 발송  / 신고내용 취합해서 한번에 정지 및 처리메일발송 ->처리메일은 신고유저 정지시 신고자에게 주는것 

풀이

 

report 순회하면서 신고현황 obj로 만들고  {신고당한:[신고한,신고한2,..], ... }
obj 순회하면서  정지된 사람인지 판별하고, resultobj={신고자:메일받을수 , ... } 를 최신화해줌
id_list 돌면서 resultobj 수 넣어서 answer 반환

 

 

만약 전부 같은신고자가 같은사람 신고한거면? -> 처음에 set 으로 중복 제거하면 해결

정답코드

def solution(id_list, report, k):
    # report 순회하면서 신고현황 obj로 만들고  {신고당한:[신고한,신고한2,..], ... }
    # obj 순회하면서  정지된 사람인지 판별하고, resultobj={신고자:메일받을수 , ... } 를 최신화해줌
    # id_list 돌면서 resultobj 수 넣어서 answer 반환
    
    setreport = set(report)
    
    reportobj={}
    for i in setreport:
        [fromwho, reported]=i.split(' ')   
        if reported in reportobj:
            reportobj[reported].append(fromwho)
        else:
            reportobj[reported]=[fromwho]
    # print(reportobj)
    
    resultobj={}    
    for key in reportobj: # key를 순회함 -> 신고당한 자들 
        length=len(reportobj[key])
        if length >= int(k):
            arr=reportobj[key]
            for who in arr:
                if who in resultobj:
                    resultobj[who]+=1
                else:resultobj[who]=1
    # print(resultobj)
    answer = []
    for id in id_list:
        if id in resultobj:
            answer.append(resultobj[id])
        else:
            answer.append(0)
        
        
    return answer