[프로그래머스] 배열 만들기 2

 

 

 

문제

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 메서드를 완성하시오

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 하시오

 

 

 

나의 답안

문제를 처음 보고 가장 먼저 생각한 구조는 아래와 같다.

 

1. l부터 r까지 숫자를 문자열로 형변환

2. 각 자리수가 5 혹은 0으로 이루어졌는지 체크

3. 해당 숫자만 리스트에 저장

4. 리스트를 배열로 변환하여 return

 

 

 

그러나 좀 더 괜찮은 방법이 없을까 아주 긴 시간 고민했다.

(5로 나누고 10으로 나눴을 때 나머지가 0 또는 1이고 등등...)

 

그러다 생각해낸 것이

 

1. 숫자를 5로 나눴을 때, 1 혹은 0으로 이루어진다.

2. [5, 50, 55, 500, 505, 550 .... ] 각 숫자를 5로 나누면 

    [1, 10, 11, 100, 101, 110 ...] 이고, 이진수로 생각하면 [1, 2, 3, 4, 5...] 와 같네?

3. l, r 까지 숫자 범위 내까지 이진수를 십진수로 바꿔 5를 곱한 값들을 배열에 넣으면 완성

 

 

그러나, 이것을 코드로 구현하는 것은 내 코딩 지식으로 도저히 이루어지지 않아.

결국 며칠을 고민하다 원래 생각했던 구조대로 작성하였다..

 

<완전 오답입니다>
static int[] solution(int l, int r) {
        ArrayList<Integer> arr = new ArrayList<>();

        for (int i=l; i<=r; i++) {
            if (i % 5 == 0) {
                int n = i / 5;
                if (n % 10 == 0 || n % 10 == 1) {
                    arr.add(i);
                }
            }
        }

        int[] result = new int[arr.size()];
        for (int i=0; i<arr.size(); i++) {
            result[i] = arr.get(i);
        }

        return result;
    }

 

 

모범 답안

import java.util.ArrayList;

class Solution {
    public int[] solution(int l, int r) {

        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 1; i < 64; i++) {
            int num = Integer.parseInt(Integer.toBinaryString(i)) * 5;
            if (l <= num && num <= r)
                list.add(num);
        }

        return list.isEmpty() ? new int[] { -1 } : list.stream().mapToInt(i -> i).toArray();
    }
}

 

  • 1 <= l <=  r <= 1,000,000 조건이 있으므로, 1부터 64까지 숫자를 이진수로 변환 (1 ~ 1000000)
  • 변환한 이진수 문자열을 정수로 변환한 후 5를 곱하여 num 변수에 저장
  • 해당 숫자(num)가 l, r 사이의 값인 경우에만 리스트에 추가

 

 

내가 몇시간씩 고민했지만 결국 실패한 코드가 이렇게 간단히 적히다니...

아직 너무 부족함을 느낀다. 열심히 공부해야겠다.

 

 

 

 

복습

       Integer 클래스 메서드

  • Integer.parseInt(String s) :문자열을 int형으로 변환
  • Integer.parseInt(String s, int radix) : 다른 진수의 값 → 10진수로 변환
  • Integer.toBinaryString(int i) : 정수를 이진수로 변환