-
HackerRank 1달 과정 1주차 10번- Permuting Two Arrays개발 여정/코딩테스트 준비 2021. 12. 28. 00:52
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" ; } }
'개발 여정 > 코딩테스트 준비' 카테고리의 다른 글
다익스트라 알고리즘 (Dijkstra's Algorithm) (0) 2023.02.26 HackerRank 1달 과정 1주차 11번- Subarray Division 1 (0) 2022.01.19 HackerRank 1달 과정 1주차 9번- Pangrams (0) 2021.12.25 HackerRank 1달 과정 1주차 8번- Counting Sort 1 (0) 2021.12.24 HackerRank 1달 과정 1주차 7번- Diagonal Difference (0) 2021.12.21