Search
Duplicate
🙇🏻‍♀️

배열 만들기 2

대분류
코딩 기초트레이닝
비고
소분류
피드백
반복문
확인
피드백완료🧑🏻‍🏫
배열 만들기 2
문제
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
풀이
package programmers.codingBasicTraining; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class PROB41 { public static void main(String[] args) { int l = 5; int r = 555; System.out.println(Arrays.toString(solution(l, r))); } public static int[] solution(int l, int r) { List<Integer> arrList = new ArrayList<>(); for (int i = l; i <= r; i ++) { String str = String.valueOf(i); int idx = 0; while (idx < str.length()) { if (str.charAt(idx) != '5' && str.charAt(idx) != '0') { break; } else { if (idx == str.length() -1) { arrList.add(Integer.parseInt(str)); break; } } idx++; } } if (arrList.isEmpty()) { int[] answer = {-1}; return answer; } else { return arrList.stream().mapToInt(i -> i).toArray(); } } }
Java
복사
피드백
package programmers.codingBasicTraining; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class PROB41 { public static void main(String[] args) { int l = 5; int r = 555; System.out.println(Arrays.toString(solution(l, r))); } public static int[] solution(int l, int r) { List<Integer> arrList = new ArrayList<>(); for (int i = l; i <= r; i ++) { // 1.숫자를 문자로변환 -> 2.각 케릭터별 값을 확인 // 피드백 1) 1번 과정(숫자를 문자로 변환) 생략할 수 있음 boolean isContains0or5 = true; int value = i; while(value != 0) { int mod = value % 10; // 1의 자릿수 추출 if (mod != 0 && mod != 5) { isContains0or5 = false; break; } value /= 10; // 오른쪽으로 한칸 shift } // 피드백 2) 정규식을 통한 방식 // [1-46-9]+ 패턴으로 검색시 true 로 리턴되면 배열에 추가 X /* 피드백 3) 관점을 전환 지금 생각 : i ~ r 까지 반복 -> 이숫자가 0 또는 5로만 이루어졌는지 ? 관점 전환 : 0 또는 5로만 이루어진 배열을 가지고있음 (5 ~ 555555) 까지 이 배열을 for문으로 돌다가 i, r사이에 있는 숫자 개수 추출 [0, 5, 50, 55, 500, 505, 550, 555 ...] => arr arr[0] ~ arr[arr.legnth - 1] => "l <= arr[i] <= r ? arrList에 추가" ??? : 그래도 저 배열을 전부 반복하는 부분에서 비효율적인거 같아.. 굳이 i=0부터 반복을 시작해야하나 ? pattern : 1자리 수일때 : 5 / idx 0 : 1의자리 (2 ^ 0 = 1) --------------------------------- 2자리 수일때 : 50 | 55 / idx1 : 2의자리 (2 ^ 1 = 2) --------------------------------- 3자리 수일떄 : 500 | 505 | 550 | 555 / idx3 : 3의자리 (2 ^ 2 = 4) --------------------------------- 4자리 수일때 : 5000 | 5005 | 5050 | 5500 | 5055 | ... (2 ^ 3 = 8) --------------------------------- pattern 1) 첫번째 숫자가 반드시 5다. pattern 2) 첫번째 자릿수를 제외한 나머지는 0,5 중복 순열 만약 patter 2) 을 찾기가 어려운 경우에는 관점 전환하는 방식으로 문제를 풀지말고, 기존 생각대로 문제를 풀되, 반복문에서 앞자리가 5가 아니면 coninue; 추가 또는 l 과 r 사이에 5로 시작하는 숫자가 없다 ? -1 리턴 <= 불필요한 for문이 안돔 */ if (isContains0or5) { arrList.add(i); } } if (arrList.isEmpty()) { int[] answer = {-1}; return answer; } else { return arrList.stream().mapToInt(i -> i).toArray(); } } }
Java
복사