Coding Test/Java Coding Test

[프로그래머스 / 자바] - 수열과 구간 쿼리 3

nam_ji 2024. 7. 15. 20:04

수열과 구간 쿼리 3

문제    

  • 정수 배열 arr과 2차원 정수 배열 queries가 매개변수로 주어집니다.
  • queries의 원소 각각 하나의 query를 나타내며 [i, j] 형태입니다.
  • 각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
  • 위 규칙에 맞게 변경된 arr을 출력하는 문제입니다.
  • 입출력 예
    • arr queries result
      [0, 1, 2, 3, 4] [[0, 3], [1, 2], [1, 4]] [3, 4, 1, 0, 2]


테스트 (인텔리제이)

  • 처음 풀이는 List의 원소 위치를 바꿔주는 Collections의 swap 메서드를 사용하여 풀어 봤습니다.
  • for문을 이용하여 arr의 원소를 하나씩 꺼내 List 타입인 answer에 담아줍니다.
  • Collections의 swap 메서드를 이용하여 인덱스 번호를 이용하여 원소의 위치를 바꿔주기 위해 for문을 한 번 더 사용했습니다.
    * swap 메서드 사용법 [Collections.swap(List, 인덱스1, 인덱스2)] 이렇게 작성하면
      첫 번째 작성된 List의 인덱스1의 원소와 인덱스2의 원소 위치를 바꿔줍니다.
  • 이렇게 풀고 return 타입을 List로 바꿔 해결했습니다.
  • 다른 사람 풀이를 보고 return 타입을 바꾸지 않고 int 배열 그대로 출력하는 풀이가 있어 가져와 봤습니다.
  • 우선 for문을 이용하여 queries의 원소를 꺼내 arr의 위치를 변경해야 하기 떄문에 queries의 각 원소를 저장할 i와 j를 선언하고 for문을 이용하기 때문에 arr의 첫 번째 원소는 바뀌기 전 원소 값을 따로 저장하고 있어야 합니다. 그래서 바뀌기 전 원소 값을 저장할 temp 변수도 선언합니다.
  • return 값이 answer를 Arrays의 copyOf 메서드로 arr 배열을 복사하고 for 문을 이용하여 queries의 값을 하나씩 꺼내줍니다. queries의 원소를 i와 j에 담고 temp에는 answer의 i번째 원소 값을 저장하도록 합니다.
  • 마지막으로 answer의 i번째 원소에 answer의 j번째 원소를 대입하고 answer의 j번째 원소에는 temp를 대입하고 위치를 바꿔주면 됩니다.
import java.util.*;

public class 수열과_구간_쿼리_3 {
  public static void main(String[] args) {
    /*
    정수 배열 arr과 2차원 정수 배열 queries가 매개변수로 주어집니다.
    queries의 원소 각각 하나의 query를 나타내며 [i, j] 형태입니다.
    각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
    위 규칙에 맞게 변경된 arr을 출력하는 문제입니다.

    입출력 예
    arr	            queries	                result
    [0, 1, 2, 3, 4] [[0, 3],[1, 2],[1, 4]]	[3, 4, 1, 0, 2]

    입출력 설명
    arr
    [0, 1, 2, 3, 4]
    [3, 1, 2, 0, 4]
    [3, 2, 1, 0, 4]
    [3, 4, 1, 0, 2]
     */

    int[] arr = {0 ,1, 2, 3, 4};
    int[][] queries = {{0, 3}, {1, 2}, {1, 4}};
    int temp = 0;
    int i = 0;
    int j = 0;
    int[] answer = Arrays.copyOf(arr, arr.length);

    for (int[] query : queries) {
      i = query[0];
      j = query[1];
      temp = answer[i];

      answer[i] = answer[j];
      answer[j] = temp;
    }
    System.out.println(Arrays.toString(answer));

//    int[] arr = {0 ,1, 2, 3, 4};
//    int[][] queries = {{0, 3}, {1, 2}, {1, 4}};
//    List<Integer> answer = new ArrayList<>();
//
//    for (int i : arr) {
//      answer.add(i);
//    }
//
//    for (int[] query : queries) {
//      Collections.swap(answer, query[0], query[1]);
//    }
//    System.out.println(Arrays.toString(answer));
  }
}

프로그래머스 코드

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int i = 0;
        int j = 0;
        int temp = 0;
        int[] answer = Arrays.copyOf(arr, arr.length);
        
        for (int[] query : queries) {
            i = query[0];
            j = query[1];
            temp = answer[i];
            
            answer[i] = answer[j];
            answer[j] = temp;
        }
        
        return answer;
    }
}

// class Solution {
//     public List solution(int[] arr, int[][] queries) {
//         List<Integer> answer = new ArrayList<>();
        
//         for (int i : arr) {
//             answer.add(i);
//         }
        
//         for (int[] query : queries) {
//             Collections.swap(answer, query[0], query[1]);
//         }
        
//         return answer;
//     }
// }

return 타입 List
return 타입 int 배열