문제 설명
정수 l과 r이 주어졌을 때, l 이상 r 이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
제한사항
- 1 <= l <= r <= 1,000,000
입출력 예
| l | r | result |
| 5 | 555 | [5, 50, 55, 500, 505, 550, 555] |
| 10 | 20 | [-1] |
import java.util.ArrayList;
class Solution {
public int[] solution(int l, int r) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = l; i <= r; i++) {
int num = i;
boolean bool = true;
while (num > 0) {
int digit = num % 10;
if (digit != 5 && digit != 0) {
bool = false;
break;
}
num /= 10;
}
if (bool) {
list.add(i);
}
}
int[] answer = new int[list.size() == 0 ? 1 : list.size()];
if (list.size() == 0) {
answer[0] = -1;
} else {
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
}
return answer;
}
}
배열의 크기를 알 수 없으므로 ArrayList를 생성합니다.
for문이 l부터 r까지 순회합니다.
num에 i를 할당합니다. 변수 num과 boolean을 이용하여 숫자 0과 5로만 이루어져 있는지 확인할 것입니다.
while문에서 num이 0보다 큰 동안 반복합니다.
변수 digit를 생성합니다. 이는 자릿수를 담을 변수입니다. num을 10으로 나눈 나머지를 할당합니다.
첫 번째 if문에서 digit가 5가 아니거나 동시에 0이 아닐 경우 boolean을 false로 갱신하고 반복문을 종료합니다. 만약 참일 경우 이후 자릿수를 더 확인해야 하기 때문에 num을 10으로 나누어 다른 자릿수를 확인합니다. 만약 모든 자릿수가 조건을 충족한다면 다음 조건문을 확인합니다.
두 번째 if문에서 bool이 true일 경우입니다. 이는 앞서 5와 0이 아닌 숫자는 포함하지 않아 false로 갱신되지 않은 상태입니다. add 메소드를 이용하여 list에 i를 삽입합니다.
answer 배열을 생성합니다. 삼항 연산자를 이용하여 list의 size가 0일 때, 즉 문제에서 제시한 범위 내에 조건을 충족하는 수가 없을 경우에는 배열의 크기를 1로, 이외에는 list의 size만큼 크기를 생성합니다.
세 번째 if문에서 list의 size가 0일 때 answer의 0 번째 원소에 -1을 할당합니다.
만약 list의 size가 0보다 크다면 ArrayList에 있는 원소들을 Array에 복사하는 과정을 거쳐야 합니다. for문이 list의 size만큼 순회하면서 answer의 i번째 원소에 list의 i번째 원소를 할당합니다.
인상 깊었던 다른 사람 풀이
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();
}
}
- ArrayList 선언: list라는 이름의 ArrayList<Integer>를 선언하여, 조건에 맞는 숫자들을 저장합니다.
- 반복문: for 반복문을 사용하여 i를 1부터 63까지 순회합니다 (2^6 - 1, 즉 64보다 작은 수까지). 이는 최대 6비트의 이진수를 처리할 수 있음을 의미합니다.
- 숫자 변환: 각 i 값에 대해 Integer.toBinaryString(i)를 호출하여 이진수 문자열로 변환한 후, 그 결과를 정수로 다시 파싱합니다. 이때, 각 비트(이진수 자리)는 '1'과 '0'으로 구성됩니다. 그런 다음 이 숫자에 5를 곱하여 '1'은 '5'로, '0'은 '0'으로 변환합니다. 예를 들어, i = 3일 때, 이진수는 "11"이고, 이를 정수로 변환하면 11이 됩니다. 여기에 5를 곱하면 55가 됩니다. 이는 '5'와 '0'으로만 구성된 수의 생성 방법입니다.
- 조건 검사: if문을 사용하여 변환된 숫자 num이 l과 r 사이에 있는지 확인합니다. 만약 num이 이 범위 내에 있다면 list에 추가합니다.
- 결과 반환: 마지막으로, list가 비어 있는지 확인합니다. 비어 있으면 배열에 -1을 담아 반환하고, 그렇지 않다면 list의 원소들을 스트림을 사용하여 int 배열로 변환하여 반환합니다
제가 이해한대로 정리해봤는데, 이진수를 활용하여 무조건 0 아니면 5로 이루어진 정수들을 얻는다는 발상이 엄청 참신했습니다. 저도 처음에는 문자열 형태로 변환하지 않고 5와 0으로만 이루어진 정수 배열을 얻을 수 있지 않을까 고민했었는데, 이런 방법으로 푸신 분이 있어서 참고용으로 함께 정리하기로 했습니다.
'문제 풀이' 카테고리의 다른 글
| 정사각형으로 만들기 - Programmers (0) | 2025.06.16 |
|---|---|
| 정수를 나선형으로 배치하기 - Programmers (1) | 2025.06.13 |
| [Java] 조건에 맞게 수열 변환하기 3 - Programmers (0) | 2025.06.13 |