배열 만들기 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
복사