코딩테스트/HackerRank

[HacerRank] Permuting Two Arrays 📌, int[]와 Integer[] 차이

주니어주니 2023. 4. 4. 23:51

 

문제 

 

A 배열과 B 배열을 조합해서 A`[i] + B`[i] >= k 를 모두 만족시키는 조합이 있으면 YES, 없으면 NO 반환

 

 

 

 

다른 사람 풀이 

 

 

 

1) List를 배열로 변환

2) 배열을 정렬 (Barr은 내림차순으로 하고싶었는데 좀 복잡하더라)

3) A 배열의 i번째와 B 배열의 역순번째(?) 합으로 계산

 

 

만약, int[ ] 가 아니라 Integer[ ] 로 받으면 내림차순 다르게 가능

 

public static String twoArrays(int k, List<Integer> A, List<Integer> B) {
    Integer[] Aarr = A.toArray(new Integer[0]);
    Integer[] Barr = B.toArray(new Integer[0]);
    
    Arrays.sort(Aarr);
    Arrays.sort(Barr, Collections.reverseOrder());
    
    for(int i=0; i<Aarr.length; i++) {
        if(Aarr[i] + Barr[i] < k) {
            return "NO";
        }
    }
    return "YES";
}

 

 

 

List를 int[ ]로 변환할 때와 Integer[ ]로 변환할 때 !!! (int와 Integer의 차이) 

 

int[ ] 로 변환할 때는 이렇게

int[ ] Aarr = A.stream().mapToInt(i -> i).toArray(); 

 

Integer[ ] 로 변환할 때는 이렇게 

Integer[ ] Aarr = A.toArray(new Integer[0]);

 

차이점

int : 기본형 타입(primitive type) 

- 변수의 타입 -> 값을 직접 저장

- 산술 연산 가능 

- null 값 가질 수 없음  

- 속도 빠름 

- 메소드 호출, 클래스 변수 사용 불가 

- Integer로 자동 형변환 가능

 

 

Integer : 참조형 타입(reference type) 

- 기본형을 객체로 다루는 래퍼 클래스 (데이터의 주소를 저장)

- unboxing 하지 않으면 산술 연산 불가능 

- null 값 가질 수 있음

- 메소드 호출, 클래스 변수 사용 가능

- int로 자동 형변환 불가 (intValue() 메소드 사용)

 

 

 

 

 

+) 다른 풀이 

 

private static String twoArrays(int k, List<Integer> a, List<Integer> b) {

    // A[i] + B[i] >= k 가 되게 하는 조합이 있는지
    // 하나는 오름차순, 하나는 내림차순 정렬한 뒤 for문 돌면서 i번째의 합 >= k

    Collections.sort(a);
    Collections.sort(b, Collections.reverseOrder());

    for(int i=0; i < a.size(); i++) {
        if(a.get(i) + b.get(i) < k) {
            return "NO";
        }
    }

    return "YES";
}