일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 호스트인식
- cta button
- WAI-ARIA
- frontend
- 객체지향
- Prototype
- 참조자료형
- 원시자료형
- 자바스크립트
- codestate
- Javascript #코드스테이츠
- CDD
- Router
- 프론트엔드
- OOP
- css in js
- self reliance
- html
- 프로토타입
- 코드스테이츠
- cta버튼
- JS
- css
- condestates
- codestates
- 코드스테이스
- 회고
- 계산기
- 개발자
- JavaScript
- Today
- Total
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
'코테 문제풀이' 카테고리의 다른 글
[코테 문제풀이]Programmers-2023 KAKAO BLIND RECRUITMENT- 개인정보 수집 유효기간, 이모티콘 할인행사, 택배 배달과 수거하기 / Python 풀이 (2) | 2023.10.29 |
---|