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;
}
}
'코테 공부 > java' 카테고리의 다른 글
주사위 네개 결과에 따른 다른 점수 반환 (0) | 2023.05.13 |
---|---|
boolean 변수 초기화? (0) | 2023.05.06 |
ArrayList<Integer> 를 int[] 배열로 변환 (0) | 2023.05.05 |
IntStream, LongStream 의 메서드 range(시작 포함, 끝 불포함) rangeClosed(시작 포함, 끝 포함) (0) | 2023.05.04 |
ArrayList 초기화 (0) | 2023.05.04 |