본문 바로가기

코테 공부/java

Integer.toBinaryString(i)-이진문자열, stream.filter(람다식)-이렇게도 활용. 범위 내 0,5로만 이루어진 모든 정수 배열 문제.

l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return

 

첫번째는 내 노가다 조잡 코드.. 눈물난다.. 돌아만 가주련.. 이런 생각으로 돌렸다.

import java.util.*;
class Solution {
    public int[] solution(int l, int r) {
    
        ArrayList<Integer> arr = new ArrayList<Integer>();
        
        for (int i = l; i <= r; i++) {
            char[] charArr = Integer.toString(i).toCharArray();
            int temp = 0;
            for (int j = 0; j < charArr.length; j++) {

                if (charArr[j] != '5' && charArr[j] != '0') break;
                else temp++;

                if (temp == charArr.length) {
                    String str = new String(charArr);
                    arr.add(Integer.valueOf(str));
                }
            }
        }
        
        if (arr.isEmpty()) return new int[]{-1};

        int[] answer = arr.stream().mapToInt(n -> n).toArray();
        
        return answer;
    }
}

 

다른 분 답안으로

이진법 생각하긴 했는데 와.. 실제 방법이 있었네

어차피 l이 1보다 크거나 같으니 0 제외하고 1부터 범위 시작해서

1,000,000 까지니까 2의 6승까지만 범위 잡으면 되고

int를 이진문자열로 바꿔준걸 또다시 int로 바꿔서..

똑똑한 분 감사합니다

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

 

또 다른 답안으로

filter 안에 람다식을 이렇게까지 쓸 수 있구나..

조건 true 를 맞춘 i를 필터링 해준다...

저렇게 끝자리 0인지 5인지는 5로 나눈 나머지가 0이면 되니까

나누고 다시 10으로 나눈 몫으로 일의 자리 날리고 남은 수의 일의자리를 또 판단하고..

똑똑한 분 감사합니다

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int l, int r) {
        int[] answer = IntStream.rangeClosed(l, r).filter(i -> {
            while (i > 0) {
                if (i % 5 != 0) return false;
                i /= 10;
            }
            return true;
        }).toArray();

        return answer.length == 0 ? new int[]{-1} : answer;
    }
}