개발일기/TIL(Since24.04.19)

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

w.llama 2024. 9. 5. 22:25

문제
https://school.programmers.co.kr/learn/courses/30/lessons/181921

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

import java.util.*;

class Solution {
    public int[] solution(int l, int r) {
        List<Integer> list = new ArrayList<>();
        
        String regx = "^[^12346789]*$";
        
        for (int i = l; i <= r; i++) {
            if (String.valueOf(i).matches(regx)) {
                list.add(i);
            }
        }

        if (list.size() > 0) {
            int[] result = new int[list.size()];
            for (int i = 0; i < list.size(); i++) {
                result[i] = list.get(i);
            }
            return result;
        }

        return new int[]{-1};
    }
}

실행시간

 

테스트 수행 시간이 너무 오래걸리는거같다 다른 사람의 풀이를 보고 줄일수 있는방법이 있는지 찾아보았다

 

다른사람 풀이

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();
    }
}

풀이를 보았을때 2진법을 활용하여 푼 방식이다

. 1<= l<= r<= 1000000  이진법으로 생각하면 1(2) = 2 , 1000000(2)= 64

integer.toBinaryString()을 활용하여 10진수를 2진수로 변환 // 리턴 타입 = String

Integer.parseInt 을활용하여 String 을 int로 변환

이후 5를 곱하여 5또는 0을 포함한 수로 변환 

위와 같은 방식으로 문제를 풀었을때 테스트 속도가 줄어드는것을 확인할수있다.