본문 바로가기
코딩테스트/자바 Level 0

[Java] 배열 만들기 2

by onggury 2023. 7. 28.

문제

정수 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