본문 바로가기
Python/알고리즘

[COS PRO 1급 #6-7] UP AND DOWN 게임

by 포푸리 (POPOOLY) 2023. 3. 10.
반응형

문제설명

UP AND DOWN 게임은 다음과 같은 규칙에 따라 진행하는 게임입니다.

* 먼저 출제자가 1 이상 ~ K 이하인 자연수 중 하나를 마음속으로 생각합니다.
* 게임 참가자는 1 이상 ~ K 이하인 자연수 중 아무거나 하나를 말합니다.
 * 만약, 참가자가 말한 숫자가 출제자가 생각한 숫자보다 작다면 출제자는 "UP"이라고 말합니다.
 * 만약, 참가자가 말한 숫자가 출제자가 생각한 숫자보다 크다면 출제자는 "DOWN"이라고 말합니다.
* 참가자는 출제자가 말하는 "UP", "DOWN" 힌트를 잘 활용해서 출제자가 처음에 생각한 숫자를 맞추면 됩니다.

출제자가 처음에 생각할 수 있는 자연수 범위 K, 게임 참가자가 말한 숫자가 순서대로 담긴 리스트 numbers, 게임 출제자가 참가자가 말한 각 숫자에 대해 답한 내용이 순서대로 담긴 리스트 up_down이 매개변수로 주어집니다. 리스트에 주어진 순서대로 게임이 진행됐다고 했을 때, 현재 정답이 될 수 있는 숫자는 몇 개인지 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

매개변수 설명

출제자가 처음에 생각할 수 있는 자연수 범위 K, 게임 참가자가 말한 숫자가 순서대로 담긴 리스트 numbers, 게임 출제자가 참가자가 말한 각 숫자에 대해 답한 내용이 순서대로 담긴 리스트 up_down이 solution 함수의 매개변수로 주어집니다.

* K는 1 이상 10,000 이하인 자연수입니다.
* numbers 리스트의 길이는 1 이상 10 이하입니다.
* numbers 리스트의 원소는 1 이상 K 이하인 자연수입니다.
* up_down 리스트의 길이는 numbers 리스트의 길이와 같습니다.
* up_down 리스트는 문자열 "UP", "DOWN", "RIGHT"으로만 이루어져 있습니다.
* "RIGHT"이 나오면 정답을 맞췄다는 것이며, 게임은 더는 진행되지 않습니다.
* 항상 올바르게 게임이 진행된 경우만 입력으로 주어집니다.

return 값 설명

리스트에 주어진 순서대로 게임이 진행됐다고 했을 때, 현재 정답이 될 수 있는 숫자는 몇 개인지
return 해주세요.

* 출제자가 "RIGHT"을 말한 상태로 게임이 끝났다면 정답을 맞춘 것이므로 1을 return 하면 됩니다.

예시

| K  | numbers   | up_down              | return |
|----|-----------|----------------------|--------|
| 10 | [4, 9, 6] | ["UP", "DOWN", "UP"] | 2      |
| 10 | [2, 1, 6] | ["UP", "UP", "DOWN"] | 3      |
| 100 | [97, 98] | ["UP", "RIGHT"] | 1      |

예시 설명

예제 #1

| 말한 숫자 | 출제자 대답 | 가능성 있는 숫자  |
|-----------|-------------|-------------------|
| 4         | "UP"        | 5, 6, 7, 8, 9, 10 |
| 9         | "DOWN"      | 5, 6, 7, 8        |
| 6         | "UP"        | 7, 8              |

따라서 현재 상황에서 가능성 있는 숫자는 2개입니다.

예제 #2

| 말한 숫자 | 출제자 대답 | 가능성 있는 숫자  |
|-----------|-------------|-------------------|
| 2         | "UP"        | 3, 4, 5, 6, 7, 8, 9, 10 |
| 1         | "UP"      | 3, 4, 5, 6, 7, 8, 9, 10        |
| 6         | "DOWN"        | 3, 4, 5              |

따라서 현재 상황에서 가능성 있는 숫자는 3개입니다.

예제 #3

| 말한 숫자 | 출제자 대답 | 가능성 있는 숫자  |
|-----------|-------------|-------------------|
| 97         | "UP"        | 98, 99, 100 |
| 98         | "RIGHT"      | 98        |

따라서 정답을 맞췄으므로 1을 return 하면 됩니다.

문제 코드

def solution(K, numbers, up_down):
    left = 1
    right = K
    for num, word in zip(numbers, up_down):
    	# UP이면 left와 num 중 큰 값이 left
        if word == "UP":
            left = max(left, num)
        # DOWN이면 right와 num 중 작은 값이 right
        elif word == "DOWN":
            right = min(right, num)
        elif word == "RIGHT":
            return 1
    return right-left-1

댓글