/ ALGORITHM

저주의 숫자 3

Algorithm 관련 포스팅

이 글은 프로그래머스의 저주의 숫자 3의 풀이를 정리한 것입니다.

문제 설명

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 ≤ n ≤ 100

입출력 예

n result
15 25
40 76

입출력 예 설명

입출력 예 #1

  • 15를 3x 마을의 숫자로 변환하면 25입니다.

입출력 예 #2

  • 40을 3x 마을의 숫자로 변환하면 76입니다.

나의 풀이(1)

  1. 주어진 n값과 같은 길이의 빈 배열(answerArr)을 생성
  2. 1부터 1씩 증가하는 i를 for문으로 설정
  3. i가 3의 배수가 아니면서, 3을 포함하지 않을 때, 배열(answerArr)에 인덱스(idx) 0부터 차례로 수를 덮어 씀
    • i % 3 != 0: 3의 배수가 아님
    • !String.valueOf(i).contains("3"): intString으로 변환한 뒤, 문자열 "3"을 포함하는 것이 아님
  4. idx가 주어진 n보다 하나 작은 값(n-1)과 같게 되면, for문을 탈출(break)

    n이 15일 경우, idx는 0부터 14까지 15개이므로

class Solution {
    public int solution(int n) {
        int answer = 0;
        int idx = 0;
        // 1.
        int[] answerArr = new int[n];
        
	// 2.
        for (int i = 1; i >= 1; i++) {

            // 3.
            if (i % 3 != 0 && !String.valueOf(i).contains("3")) {
                answerArr[idx] = i;

		// 4.
                if (idx == n -1) break;
                idx++;
            }
        }
        
        answer = answerArr[n-1];
        return answer;
    }
}

나의 풀이(2)

  1. 0부터 1씩 증가는 i가, n보다 작을 때까지 도는 for문 설정
  2. i마다 answer를 1씩 증가시킴
  3. answer가 3의 배수이거나 숫자에 "3"이 있으면, answer를 1 더 증가시킴
    • 즉, 해당 index(i)의 answer가 1 증가됨
    • n = 15일때 answer 값의 변화

      n 15                            
      i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      answer 0 1 2 4 5 7 8 10 11 14 16 17 19 20 22
      while(answer) 1 2 3 5 6 8 9 11 12 15 17 18 20 21 23
      answer++     4   7   10   13 16   19   22 24
      answer++                 14           25
class Solution {
    public int solution(int n) {
        int answer = 0;

	// 1.
        for (int i = 0; i < n; i++) {
	    // 2.
            answer++;
	    // 3.
            while (answer % 3 == 0 || String.valueOf(answer).contains("3")) {
                answer++;
            }
        }
        return answer;
    }
}