알고리즘

[프로그래머스] 저주의 숫자3

winwin-k9 2023. 9. 17. 01:51

문제

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진법 3x 마을에서 쓰는 숫자 10진법 3x 마을에서 쓰는 숫자
1 1 6 8
2 2 7 10
3 4 8 11
4 5 9 14
5 7 10 16
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.      

풀이

이전 숫자에서 + 1을 하여 현재 숫자를 더한다.
이때 두가지 경우를 체크해야 한다.

이전 숫자 + 1 숫자를 num이라고 하자.
num이 3의 배수가 아닌지와 num이 3을 포함하는지 이 두가지를 체크한다.
만일 이 경우에 들어간다면 이전숫자 + 1이 아닌 저 경우가 아닐때까지 1을 더하여 num을 구하도록 한다.

꽤나 복잡한 함수를 만들었는데 간단히 contians를 사용하면 되었는데....
왜 풀때 생각이 안났을까 ㅜ

import java.util.*;
import java.lang.*;

class Solution {
    public int solution(int n) {
        int answer = 0;

        int[] arr = new int[n + 1];
        arr[1] = 1;
        for(int i = 2; i <= n; i++) {
            if ((arr[i - 1] + 1) % 3 == 0 || check(arr[i - 1] + 1)) {
                arr[i] = getNum(arr[i - 1] + 1);
            } else {
                arr[i] = arr[i - 1] + 1;
            }

        }


        return arr[n];
    }

    static boolean check(int n) {
        int[] arr = Arrays.stream((n + "").split("")).mapToInt(Integer::parseInt).toArray();
        for(int a : arr) {
            if (a == 3) {
                return true;
            }
        }

        return false;
    }

    static int getNum(int n) {
        boolean flag = true;
        while(flag) {
            n++;
            int[] arr = Arrays.stream((n + "").split("")).mapToInt(Integer::parseInt).toArray();
            flag = false;
            for(int a : arr) {
                if (a == 3 || n % 3 == 0) {
                    flag = true;
                }
            }

        }


        return n;
    }
}

https://github.com/Win-9/Algorism/tree/main/programers/%EC%A0%80%EC%A3%BC%EC%9D%98%20%EC%88%AB%EC%9E%90

728x90