프로그래머스 코딩테스트 실전 대비 모의고사 3차

yoongyum·2022년 8월 20일
0

코딩테스트 🧩

목록 보기
47/47
post-thumbnail

모의고사 보러가기😀

3차 문제집

공개일 - 2022.08.10. 14:00
종료일 - 2022.08.23. 23:59

제한시간 180분



선후기

3차는 문제 자체가 어려운건 아니였으나, 문제를 이해하는데 시간이 너무 오래 걸렸습니다..

총 4문제였고, 2,3번에서 시간을 너무 많이 써서 4번을 풀지 못했습니다.



1번 문제

1번 문제는 콜라병 갯수 구하기 문제입니다.

저는 단순하게 문제조건 그대로 for if 조건 식을 짜서 풀었습니다.

💡문제설명

총 콜라병의 갯수 n이 주어지고, a만큼 반납하면 b만큼 돌려받을 수 있습니다.

콜라병을 최대로 돌려받을 수 있는 수를 구하는 문제입니다.

남은 콜라병이 a보다 작으면 교환 할 수 없습니다.

제한사항📌

  • 1 ≤ b < a < n ≤ 1,000,000
  • 정답은 항상 int 범위를 넘지 않게 주어집니다.

🧊 파이썬 코드

def solution(a, b, n):
	answer = 0
    while n >= a:
    	answer += (m//a)*b
        n = n % a + (n//a)*b
    return answer

사실, 간단한 문제라서 딱히 설명은 하지 않고 넘어가겠습니다.



2번 문제

2번 문제에서 삽질을 많이 했습니다.

스택알고리즘을 사용하는 문제입니다.

💡문제설명

ingredient 정수 배열에 조리 순서로 햄버거 재료가 들어있습니다.

이 순서에서 [빵, 야채, 고기, 빵] 순으로만 햄버거를 만들 수 있습니다.

제한사항📌

  • 1 ≤ ingredient의 길이 ≤ 1,000,000
  • ingredient의 원소는 1,2,3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

🧊파이썬 코드

from collections import deque
def solution(ingredient):
	answer = 0
    hamburg = deque()
    for i in ingredient:
    	hamburg.append(i)
        if len(hamburg) >= 4:
        	tmp = deque()
            for _ in range(4): #뒤에서부터 4개를 꺼내서 tmp에 저장
            	tmp.appendleft(hamburg.pop())
            if tmp == deque([1,2,3,1]): #햄버거를 만들 수 있는 조건인지 확인
            	answer += 1
            else:
            	hamburg.extend(tmp) #안된다면 hamburg배열에 추가
     return answer

처음코드를 짰을 때는 배열 하나를 만들어서 1일때의 조건과 2일때의 조건 3일때의 조건을 만들어서 했는데,
어째서인지 히든케이스 몇개를 통과를 못했습니다.



3번 문제

3번 문제는 문제를 이해하는데 시간이 걸렸습니다.

문제를 이해한 뒤에도 곳곳의 함정? 때문에 문제를 찾느라 애를 먹었습니다.

💡문제설명

1부터 출발해서 distance의 거리까지 가는동안 경비병의 근무시간에 발각 되지 않고 갈 수 있는 최대 거리를 구하는 문제입니다.

경비병마다 근무시간과 휴식시간이 있고, 감시하는 구간이 정해져있습니다.

제한사항📌

  • 10 ≤ distance ≤ 10,000,000
  • 1 ≤ scope의 길이, times의 길이 ≤ 1,000
    - scope[i]는 i+1번째 경비병이 감시하는 구간입니다.
    - scope[i]를 [a, b]라고 했을 때, (a!=b)입니다.
    - scope[i]는 정렬되어 있지 않을 수 있습니다.
    • 1 ≤ scope의 원소 ≤ 10
    • times[i]는 i+1번째 경비병의 [근무 시간, 휴식 시간]입니다.

🧊파이썬 코드

def solution(distance, scope, times):
	answer = distance
    for i in range(len(scope)):
    	work, rest = times[i]
        start, end = scope[i]
        big = max(start, end)
        small = min(start, end)
        for j in range(small, big + 1):
        	cal = j%(work+rest)
            if cal <= work and cal !=0:
            	answer = min(answer, j)
     return answer

문제 접근 방법은 1부터 distance거리까지 다 체크하는 것이 아니라 경비병의 근무 범위만 체크하는 것 입니다.

그리고 그 근무 범위일때 하나라도 근무이면 answer에 최소 값을 저장하면 서 반복하는 문제입니다.

저는 근무 범위가 [큰 수, 작은 수]로 나오는 줄 알고 한참을 삽질했습니다.


++

4번 문제는 시간 부족으로 풀지 못했습니다..

모의고사 3개를 풀어봤는데, 성장한거 같으면서도 아직은 조금 부족한 것 같습니다.

✋ 앞으로도 꾸준히 문제를 풀어나가야겠습니다.

0개의 댓글