코딩테스트/Programmers

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

grove1212 2025. 1. 22. 20:58
  • list의 사용법과 배열의 사용법을 알아야 풀 수 있는 문제였다.

List 사용법

다음과 같이 클래스를 import 해온 후 사용할 수 있다. 시험 때도 자유자재로 사용가능할지 잘 모르겠다.

import java.util.LinkedList;
import java.util.List;

List<Integer> arr = new LinkedList<>();

배열 사용법

        int[] answer = {};

위와 같이 초기화가 가능하다. 하지만 아래와 같이 선언 이후에 초기화할 수는 없다.

        int[] answer;
        answer = {};

내 코드

무조건 길이를 받아와야 한다. 그래서 내가 작성한 정답코드는 다음과 같다. 머리 쓰지 않고, 1,2,3,4,6,7,8,9숫자가 들어있으면 continue로 pass하는 방법을 선택했다.

import java.util.LinkedList;
import java.util.List;

class Solution {
    public int[] solution(int l, int r) {
        int[] answer = {};

        List<Integer> arr = new LinkedList<>();


        for(int i = l; i <= r; i++){
            String str = "" + i;
            if(str.contains("1") || str.contains("2") || str.contains("3") || str.contains("4") || str.contains("6") || str.contains("7") || str.contains("8") || str.contains("9")){
                continue;
            }

            arr.add(i);      
        }

        if(arr.isEmpty()){
            answer = new int[1];
            answer[0] = -1;
            return answer;
        }
        answer = new int[arr.size()];
        int idx = 0;

        for(int element : arr){
            answer[idx++] = element;
        }

        return answer;
    }
}

참고용 코드 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++) {
            // 1) i를 2진수로 변환 (예: i=5 -> "101")
            // 2) 2진수 문자열을 그대로 10진수로 parse (예: "101" -> 10진수 101)
            // 3) 여기에 5를 곱한 값 (101 * 5 = 505)
            int num = Integer.parseInt(Integer.toBinaryString(i)) * 5;

            // l <= num <= r 범위이면 list에 추가
            if (l <= num && num <= r)
                list.add(num);
        }

        // list가 비어있다면 -1, 그렇지 않다면 배열로 변환 후 반환
        return list.isEmpty() ? new int[] { -1 } : list.stream().mapToInt(i -> i).toArray();
    }
}

참고용 코드 2

stream 라이브러리를 이용해 정답을 만들었다.

import java.util.*; 
import java.util.stream.*; 

class Solution { 
    public int[] solution(int l, int r) { 
        // 1) l부터 r까지 모든 정수에 대해 Stream 생성
        List<Integer> filtered = IntStream.rangeClosed(l, r)
                // 2) 각 정수 num을 문자열로 바꾼 후, 
                //    모든 문자가 '0' 또는 '5' 인지 확인
                .filter(num -> String.valueOf(num)
                    .chars()
                    .allMatch(ch -> ch == '0' || ch == '5'))
                // 3) 조건을 만족하는 정수만 IntStream에 남긴다
                .boxed()  // IntStream -> Stream<Integer> 로 변환
                .collect(Collectors.toList()); // List<Integer>로 모은다

        // 4) 조건을 만족하는 수가 없다면 [-1], 있으면 배열로 변환하여 반환
        return filtered.isEmpty()
                ? new int[] {-1}
                : filtered.stream().mapToInt(Integer::intValue).toArray();
    }
}

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