개발자식

[프로그래머스] 실전 모의고사 (1) 본문

Algorithm/Programmers

[프로그래머스] 실전 모의고사 (1)

밍츠 2022. 8. 19. 14:21

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)로 반환

입출력 예

X Y result
"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

 

나의 풀이

from collections import Counter
def solution(X, Y):
    answer = []

    dic = Counter(X) & Counter(Y)

    if dic == {}:
        return "-1"

    arr = sorted(dic.items())
    
    if arr[0][0] == '0' and len(arr) == 1:
        return "0"
   
    for i in arr:
        answer.append(i[0]*i[1]) 
 
    return ''.join(reversed(answer))

 

 

2번 문제

문제설명

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

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

회원 등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하시오 (가능한 날이 없다면 0 return)

제한사항

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

 

나의 풀이

from collections import Counter
def solution(want, number, discount):
    answer = 0
    arr = []

    for i in range(len(want)):
        arr.extend([want[i]] * number[i])

    dic = Counter(arr)
    for i in range(len(discount)-10+1):
        c = Counter(discount[i:i+10])
        if dic - c == Counter():
            answer+=1

    return answer

 

 

3번 문제

문제설명

택배상자에 트럭을 실어야 하는데, 택배 상자는 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 놓여 전달된다. 순서대로 상자를 내릴 수 있는데 트럭에 실어야 하는 순서(order)에 맞춰 상자를 실어야 한다. 

현재 트럭에 실어야 하는 순서가 아니라면 보조 컨테이너를 이용하여 잠시 보관할 수 있다.

[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번째로 트럭에 실어야 함을 의미

 

나의 풀이

from collections import deque
def solution(order):
    answer = 0
    temp = [i for i in range(1,len(order)+1)]
    q = deque(temp)
    o = deque(order)
    stack = []


    while q:
        if o[0] == q[0]:
            o.popleft()
            q.popleft()
            answer+=1
        else:
            if stack != [] and stack[-1] == o[0]:
                o.popleft()
                stack.pop()
                answer+=1
            else:
                stack.append(q.popleft())
    if o == []:
        return answer
    
    while o:
        if stack[-1] == o[0]:
            stack.pop()
            o.popleft()
            answer+=1
        else:
            break


    return answer

 

4번 문제

문제 설명

직사각형 모양의 공간에 동전들을 뒤집는 놀이를 하고 있다. 동전은 앞과 뒤가 구분되어 있고 동전을 뒤집으면 같은 줄에 있는 모든 동전을 뒤집어야 한다. (행, 열 뒤집기)

최소 몇 번의 동전을 뒤집어야 목표 상태가 되는지 구합니다. (없으면 -1 return)

 

나의 풀이

모르겠다ㅠㅠ

 

 

최종 점수 : 300점

Comments