[프로그래머스] 배열 만들기 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) : 정수를 이진수로 변환