저주의 숫자 3

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120871

접근 방식

  • 숫자가 3으로 나누어 떨어지거나, 3이 들어가는 경우 그렇지 않을 때까지 숫자를 더한다.

잘못된 접근

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

        for(int i=0; i<n; i++){
            answer++;
            while(answer%3==0 || answer/10==3 || answer%10==3){
                answer++;
            }
        }
        return answer;
    }
}

테스트 케이스를 통과했지만, 제출에서 테스트 4번과 5번에서 실패가 나왔다.

테스트 케이스를 넣어보다가, answer가 100이상으로 올라가면서 십의자리가 3인 경우는 체크하지 못하고 있음을 알게되었다.

따라서, 백이상의 숫자에 대한 검사도 추가했다.

(answer%100)/10==3;

결과

소스 코드

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

        for(int i=0; i<n; i++){
            answer++;
            while(answer%3==0 || answer/10==3 || answer%10==3 || (answer%100)/10==3){
                answer++;
            }
        }
        return answer;
    }
}

다른 접근 방식

String을 이용한 방법

내가 사용했던 코드는 숫자만 이용했던 방법이고, String을 이용하면 while문을 만족하는 조건을 줄일 수 있고, 거의 무제한으로 계산할 수 있다.

변경 코드

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

        for(int i=0; i<n; i++){
            answer++;
            // while문에서 answer를 String으로 변환하고, 여기에 3이 포함되어 있는지 여부를 판단
            while(answer%3==0 || String.valueOf(answer).contains("3")){
                answer++;
            }
        }
        return answer;
    }
}

알게 된 점

없음.