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

yoongyum·2022년 7월 26일
2

코딩테스트 🧩

목록 보기
45/47
post-thumbnail

실력이 부족하더라도 공짜로 보는 것이니 풀어보시길..
바로가기

1차 문제집

공개일 - 2022.07.13. 10:00
종료일 - 2022.08.23. 23:59

제한시간 180분



선 후기

총 4문제였고, 저는 1, 2, 3번까지는 풀었습니다.

1번 문제부터 제 입장에서는? 어려웠습니다.
나중에 2, 3번 풀고 나서는 오히려 1번보다 쉽다고 느꼈습니다.

4번은 풀기 시작했을 때는 약 40분 정도 남았었는데 파훼법을 몰라서 결국 못 풀었습니다.

3문제(300점)를 맞춘 저는 약 상위 63%라 뜨더군요..ㅜ


결론:
300점은 63%이고 400점은 91%이므로 만점아니면 취업이 힘들 것으로 예상...



1번 문제

위에서도 언급했지만, 1번문제에서 제일 시간을 오래 끌렸습니다.

💡문제설명

입력으로 정수로 이루어진 X, Y를 받습니다. (타입은 String) ex: X = "100", Y = "2345"
X 와 Y 각 인덱스 마다 같은 숫자를 짝을 짓습니다.
짝이 지어지는 숫자들로 만들 수 있는 가장 큰 수를 리턴합니다.

X, Y의 짝궁이 하나도 존재하지 않으면 "-1"을 리턴합니다.
또한 짝궁이 0으로만 구성 되어있다면 "0"을 리턴합니다.

제한사항

  • 3 ≤ X, Y 의 길이(자릿수) ≤ 3,000,000 입니다.
  • X, Y 는 0으로 시작하지 않습니다.
  • X, Y 의 짝꿍은 상당히 큰 정수일 수 있으므로 문자열(String)로 반환

입출력 예

XYresult
"100""2345""-1"
"100""203045""0"
"100""123450""10"
"12321""42531""321"
"5525""1255""552"

🧊파이썬 코드

def solution(X, Y):
	res = []
    for s in list(set(X)&set(Y)):
    	sc = X.count(s)
        bc = Y.count(s)
        for i in range(min(sc, bc)):
        	res.append(s)
            
    if not res : return '-1'
    if max(res) == '0' : return '0'
    res.sort(reverse=True)
    return ''.join(res)

짝궁을 찾는 게 이문제에서 핵심이였던것 같습니다.
찾고나서 sort로 정렬해줄때는 시간초과가 안나는 걸 보면 그렇게 생각했습니다. (시간초과가 왜 안날까요?)

저의 풀이는 먼저, XY의 📌교집합을 먼저 구했습니다.

list(set(X)&set(Y))

위 코드를 실행하면, XY갯수에 상관 없이 공통되는 수들만 리스트에 남게 됩니다.

하지만 저희는 갯수도 알아야합니다.
따라서 각각 count메서드로 해당 숫자의 갯수를 구하고 동일한 숫자만큼 res에 추가해줍니다.

이렇게 코드를 짜면서도 될까..하고 채점을 해봤는데 다행이 100점이 나와서 다행이였지만, 뭔가 모범 답안은 아닌것 같은 느낌이 들어 찝찝합니다.

다른 사람은 어떻게 풀었는지 알고 싶네요..



2번 문제

2번문제를 보자마자 어려울것 같아서 실제로는 3번을 먼저 풀고나서 2번으로 돌아와 풀었습니다. ^^

💡문제설명

XYZ마트는 10일동안 회원자격을 부여합니다.
회원을 대상으로는 매일 한 가지 제품을 할인하는 행사를 합니다.
할인하는 제품은 하루에 하나만 구매할 수 있습니다.

자신이 원하는 제품과 수량이 할인하는 날짜와 10일연속으로 일치할 경우에 맞춰서 회원가입을 하려고합니다. (극한의 이득충이 되자..)

제한사항

  • 1 ≤ want의 길이 = number의 길이 ≤ 10
    • 1 ≤ number의 원소 ≤ 10
    • number[i]want[i]의 수량을 의미하며, number의 원소의 합은 10
  • 10 ≤ discount의 길이 ≤ 10
  • wantdiscount의 원소들은 알파벳 소문자로 이루어진 문자열
    • 1 ≤ want의 원소의 길이, discount의 원소의 길이 ≤ 12

🧊파이썬 코드

from collections import defaultdict
def solution(want, number, discount):
	hm = defaultdict(int)
    for i in range(len(want)):
    	hm[want[i]] = number[i]
        
    answer = 0
    for i in range(len(discount)-9):
    	dc = discount[i:i+10]
        cnt = 0
        for w in want:
        	if hm[w] == dc.count(w)
            	cnt += 1
        if cnt == len(want):
        	answer += 1
    return answer

해쉬맵을 통해서 필요한 과일명을 key로 하고 숫자를 value로 줘서 만들었습니다.

10칸을 기준으로 순서대로 리스트를 잘라서 dc에 저장합니다.
해당 기간에 해당 과일을 몇개씩 살 수 있는 지 갯수를 셉니다.

과일별로 할인구매 할 수 있는 수들이 모두 일치할 경우 answer을 + 1 해줍니다. (반복)

풀고 나서 든 생각은 2번이 제일 쉬웠습니다.. 제일 어려울 줄 알았는데



3번 문제

3번문제는 큐, 스택 알고리즘 문제였습니다.

문제가 기억이 안나서 기억나는 대로 적스니다.

💡문제설명

[1,2,3,4,5] 순의 택배물이 있다고 가정합니다.

order에는 실어야하는 택배물의 순서가 들어있습니다.
예로 [4,3,1,2,5] 이라고 한다면, 4번이 제일 먼저 실어야하기 때문에 1,2,3번을 컨테이너 벨트에 올립니다.

[4,5]가 남은 상황에서 4번을 빼내고 다음 순서인 3번을 컨테이너 벨트에서 가져와 트럭에 넣습니다.

그 다음순서는 1번인데 1번은 2번뒤에 있기때문에 빼낼 수 없습니다.

따라서 트럭에 넣는 택배물은 4,3번 두개뿐이라서 2를 리턴합니다.

제한사항

  • 1 ≤ order의 길이 ≤ 1,000,000
  • order는 1이상 order의 길이 이하의 모든 정수가 한번씩 등장
  • order[i]는 기존의 컨테이너 벨트에 order[i]번째 상자를 i+1번째로 트럭에 실어야 함을 의미

입출력 예

orderresult
[4,3,1,2,5]2
[5,4,3,2,1]5

🧊파이썬 코드

from collections import deque
def solution(order):
	Q = deque()
    for i in range(1,len(order)+1):
    	Q.append(i)
    st = deque()
    cnt = 0
    while Q:
    	if order[cnt] != Q[0]:
        	if st and order[cnt] == st[-1]
            	cnt += 1
                st.pop()
            else:
            	st.append(Q.popleft())
        else:
        	cnt += 1
            Q.popleft()
            
    while st:
        if order[cnt] == st[-1]:
            cnt += 1
            st.pop()
        else:
            break
    return cnt

Q 택배 갯수만큼 순서대로 리스트를 만들어줍니다. 큐로 사용할 것 입니다.
st는 컨테이너 벨트 리스트입니다. 스택으로 사용할 것 입니다.

순서대로 order와 비교합니다.
다르면 스택의 top과 비교하고 그래도 다르면 큐에서 맨앞 요소를 스택에 올립니다.

스택의 top과 같다면 스택을 pop하고 cnt를 + 1 합니다.

큐의 맨앞과 같다면 큐를 pop하고 cnt를 + 1 합니다.

큐가 비어있다면 , 스택 탑이 order순서와 다른게 나올때까지 돌리고 cnt를 리턴합니다.



4번 문제는 해설 코드가 나올때까지 존버하겠습니다.

✋ 감사합니다.

6개의 댓글

comment-user-thumbnail
알 수 없음
2022년 7월 28일
수정삭제

삭제된 댓글입니다.

2개의 답글
comment-user-thumbnail
2022년 8월 2일

요번 모의고사 문제집은 푸는 사람 다 같은 문제를 푼건가요?

1개의 답글
comment-user-thumbnail
알 수 없음
2022년 8월 3일
수정삭제

삭제된 댓글입니다.

1개의 답글
comment-user-thumbnail
2022년 8월 21일

댓글이 안 달려서 다시 올려요. 풀이 공유가 가능하다는 점 확인하고 저도 풀이 영상을 따로 찍어서 유튜브에 올렸습니다. 3차까지 완료했어요. 도움이 됐으면 좋겠습니다. https://www.youtube.com/watch?v=1Rkbr0AVlq0&t=3052s

답글 달기