ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HackerRank 1달 과정 1주차 10번- Permuting Two Arrays
    개발 여정/코딩테스트 준비 2021. 12. 28. 00:52

    https://www.hackerrank.com/challenges/one-month-preparation-kit-two-arrays/problem?isFullScreen=true&h_l=interview&playlist_slugs%5B%5D=preparation-kits&playlist_slugs%5B%5D=one-month-preparation-kit&playlist_slugs%5B%5D=one-month-week-one 

     

    n개의 길이를 가진 배열 A와 B가 있고, 이를 재정렬했을 때 A[i] + B[i]의 값이 n보다 크거나 같을 경우 "YES", 아닐 경우 "No"를 return하는 문제이다.

    사실 HackerRank는 문제 자체만 봤을 때 잘 이해가 안 가는 경우가 많다. 밑에 샘플 설명을 봐야 정확히 뭘 요구하는지 알기 쉽다. 밑에 샘플을 보면 A 배열은 오름차순, B 배열은 내림차순을 한 뒤 각각 같은 자리에 있는 배열끼리 더했다. 그 때 배열의 길이보다 적을 경우 "NO"를 리턴한다는 문제이다.

    class Result {
    
    
        public static String twoArrays(int k, List<Integer> A, List<Integer> B) {
        
        String answer = "";
        
        // 1. List인 A와 B를 배열로 만들어줄 Integer형 a[],b[]를 선언한다.
        Integer[] a = new Integer[A.size()];
        Integer[] b = new Integer[B.size()];
        
        // 2. List인 A와 B의 값을 배열에 넣는다.
        for(int i = 0; i < A.size(); i++){
            a[i] = A.get(i);
            b[i] = B.get(i);
        }
    
        // 3. 배열 a를 오름차순, b를 내림차순 정렬한다.
        Arrays.sort(a);
        Arrays.sort(b, Collections.reverseOrder());
        
        // 4. for문을 돌려 k보다 큰지 작은지 answer에 YES, NO를 넣도록 한다.
        for(int i = 0; i < a.length; i++){
            if(a[i] + b[i] >= k){
                answer = "YES";
            } else {
                answer = "NO";
                break;
            }
        }
        
        // 5. answer를 리턴한다. 
        return answer;
        
        }
    
    }
    
    public class Solution {
        public static void main(String[] args) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
    
            int q = Integer.parseInt(bufferedReader.readLine().trim());
    
            IntStream.range(0, q).forEach(qItr -> {
                try {
                    String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
    
                    int n = Integer.parseInt(firstMultipleInput[0]);
    
                    int k = Integer.parseInt(firstMultipleInput[1]);
    
                    List<Integer> A = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
                        .map(Integer::parseInt)
                        .collect(toList());
    
                    List<Integer> B = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
                        .map(Integer::parseInt)
                        .collect(toList());
    
                    String result = Result.twoArrays(k, A, B);
    
                    bufferedWriter.write(result);
                    bufferedWriter.newLine();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            });
    
            bufferedReader.close();
            bufferedWriter.close();
        }
    }

     

    * 포인트

    - 배열의 내림차순 정렬: Collections.reverseOrder() 함수의 경우, int와 같은 primitive 타입은 지원하지 않으므로 Wrapper Class인 Integer 배열로 선언하는 것이 중요하다.


    + 인도 유저의 간단한 풀이 (Soultion Class는 같으므로 생략)

     - List를 배열로 변환하지 않고 그대로 Collections.sort()하고 연산했다.

       if ~ else (break)을 쓰지 않고 "NO"가 나오는 if문을 앞에 두고 class의 return값이 "YES"가 되도록 했다.

    class Result {
    
        public static String twoArrays(int k, List<Integer> A, List<Integer> B) {
    
        Collections.sort(B, Collections.reverseOrder());
     
        // Sort the array b[] in increasing order.
        Collections.sort(A);
     
        // Checking condition on each index.
        for (int i = 0; i < A.size(); i++)
        if (A.get(i) + B.get(i) < k)
            return "NO";
     
        return "YES" ;
    
        }
    
    }
Designed by Tistory.