문제
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
제한사항
- 1 ≤ l ≤ r ≤ 1,000,000
import java.util.ArrayList;
class Solution {
public int[] solution(int l, int r) {
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = l; i <= r; i++) {
String numStr = Integer.toString(i);
if(numStr.matches(".*[1-4].*") || numStr.matches(".*[6-9].*")) {
continue;
}
result.add(i);
}
int[] answer = new int[result.size()];
for(int i = 0; i < answer.length; i++) {
answer[i] = result.get(i);
}
if(answer.length == 0) {
answer = new int[1];
answer[0] = -1;
}
return answer;
}
}
나같은 경우는 정규식을 이용해서 해결했다.
이진화 방법으로 해결할 수 있을거 같았지만 머리의 한계로 일단 정규식으로 풀었다.
다른사람 풀이를 보니 역시 이진화를 사용한 사람들이 있었다.
제한조건에 따라 1,000,000 이란 숫자는 이진화처럼 본다면 1000000 이므로 십진수로 64이다.
그래서 반복문을 1~64까지 돌린 후 계속 값을 이진화를 시켜서 거기에 5를 곱한다.
예를들어 1 → 0001 * 5 → 5
2 → 0010 * 5 → 50
3 → 0011 * 5 → 55
즉, 이진화를 마치 10진수처럼 보면서 해결하는 방법이라 볼 수 있다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/181921