문제 설명

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

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

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

 

매개변수 설명

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

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

return 값 설명

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

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

예제

K numbers UpDown 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 하면 됩니다.

 

소스 코드

문제 풀이

임의로 부른 숫자가 up일 경우 기존의 left와 교체를, down일 경우 기존의 right와 교체해주면 된다.
이후 결과로 left, right 범위의 가능한 수 들을 출력해주면 된다.

class Solution {
    public int solution(int K, int[] numbers, String[] UpDown) {
        int left = 1;
        int right = K;
        for(int i = 0; i < numbers.length; i++) {
            int num = numbers[i];
            if(UpDown[i].equals("UP"))
                left = Math.max(left,num);
            else if(UpDown[i].equals("DOWN"))
                right = Math.min(right,num);
            else if(UpDown[i].equals("RIGHT"))
                return 1;
        }
        return right-left-1;
    }

나는 자바의 Math 클래스를 이용해 풀었고 다른 사람들은 단항 연산자를 통해 푼 답들도 확인할 수 있었다.

left = left>=num ? left:num;
right = right<=num ? right:num;

 

 

 

+ Recent posts