본문 바로가기

코딩 테스트/문제

[코딩 테스트] 배열 만들기 2

오늘 코딩테스트를 공부하다가 다른사람의 풀이를 보았는데 정말 똑똑하게 푼 것 같은 내용이 있어서 저도 복습할 겸 정리하면서 소개해드리고 싶었습니다.

 

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();
    }
}

 

저는 처음에 단순히 반복문으로 l부터 r까지 돌면서 풀려고 했는데 이 분은 이진수로변환하여 푸셨더라구요.

0과 5로만 이루어진 숫자를 생성하기 위해서 숫자를 이진수로 변환하여 "0", "1"을 각각 "0"과 "5"로 매핑!

방법) 십진수를 이진수로 변환하고 * 5 (변환하는 방법은 아래에서 설명할게요)

십진수 1 : 이진수 1 => 1*5 = 5

십진수 2 : 이진수 10 => 10*5 = 50

십진수 3 : 이진수 11 => 11*5 = 55

십진수 4: 이진수 100 => 100*5 = 500

십진수 5: 이진수 101 => 101*5 = 505

십진수 6: 이진수 110 => 110*5 = 550

이런식으로 계산을 한 다음에 범위 [l, r]에 포함되는지 확인을 하고, 리스트에 추가

if (l <= num && num <= r)
    list.add(num);

 

그럼 여기에 나오는 이진수와 십진수란?

이진수는 0과 1만 사용하여 숫자를 표현하는 방법.

이진수(Binary Number) : 컴퓨터가 사용하는 숫자 체계로, 0과 1만 사용

십진수(Decimal Number) : 우리가 일상에서 사용하는 숫자 체계, 0~9 사이의 숫자

 

이진수와 십진수의 관계

  • 십진수 1 = 이진수 1
  • 십진수 2 = 이진수 10 (1×2¹ + 0×2⁰)
  • 십진수 3 = 이진수 11 (1×2¹ + 1×2⁰)
  • 십진수 4 = 이진수 100 (1×2² + 0×2¹ + 0×2⁰)
  • 십진수 5 = 이진수 101 (1×2² + 0×2¹ + 1×2⁰)

 

십진수를 이진수로 변환하는 방법

1. 십진수를 2로 나누고 몫과 나머지를 계산.

2. 나머지를 기록 : 나머지가 이진수의 각 자리를 나타냄

3. 몫이 0 이 될 때까지 반복 : 몫이 0 이되면 변환이 끝

4. 나머지를 거꾸로 읽음: 기록한 나머지를 역순으로 읽으면 이진수가 됨.

 

 

사용된 주요 메소드와 개념

  1. Integer.toBinaryString(i):
    • 정수 i를 이진수 문자열로 변환.
    • 예: 3 -> "11", 5 -> "101".
  2. Integer.parseInt():
    • 문자열을 정수로 변환.
    • 예: "11" -> 11.
  3. 리스트를 배열로 변환:
    • list.stream().mapToInt(i -> i).toArray():
      • 리스트를 스트림으로 변환한 후 각 요소를 int로 매핑하고 배열로 변환.
  4. 조건부 반환:
    • list.isEmpty() ? new int[] { -1 } : ...
      • 리스트가 비어 있으면 {-1}을 반환, 아니면 변환된 배열을 반환.

 

끝!