KDLiam

[Programmers 코딩 기초 트레이닝 : Java] 수열과 구간 쿼리 3 본문

Problems(Java)/Programmers

[Programmers 코딩 기초 트레이닝 : Java] 수열과 구간 쿼리 3

KDLiam 2025. 10. 13. 14:39

🔗 문제 링크

프로그래머스 181924 - 배열 요소 위치 바꾸기


💡 문제 요약

  • 정수 배열 arr과 2차원 배열 queries가 주어집니다.
  • queries의 각 쿼리 [i, j]에 대해 arr[i]와 arr[j]를 swap합니다.
  • 모든 쿼리를 수행한 후 배열을 반환합니다.

예:
arr = [1,2,3,4], queries = [[0,2],[1,3]]

  1. swap(0,2) → [3,2,1,4]
  2. swap(1,3) → [3,4,1,2]
    결과 → [3,4,1,2]

🧩 내가 작성한 코드

 
import java.util.Arrays;

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

💡 코드 설명

  1. 배열 복사
    • Arrays.copyOf(arr, arr.length) → arr 원본을 유지하면서 작업
  2. 각 쿼리 순회
    • 쿼리 [i,j]마다 answer[i]와 answer[j] swap
  3. 최종 배열 반환

⚡ 성능 분석

항목내용
시간 복잡도 O(n + q)
  • n = arr 길이 (복사)
  • q = queries 길이 (swap) |
    | 공간 복잡도 | O(n) → 배열 복사로 answer 생성 |
    | 성능 평가 | ✅ 충분히 효율적, swap만 반복하므로 최적 수준 |

📝 개선 여지

  1. 원본 배열을 변경 가능하면
    • Arrays.copyOf 생략 → 공간 절약 가능 (O(1))
     
    for(int[] query : queries){ int t = arr[query[0]]; arr[query[0]] = arr[query[1]]; arr[query[1]] = t; } return arr;
  2. 쿼리 수가 매우 많다면
    • 최적화 가능: 인덱스 매핑 배열을 두고 마지막에 한 번만 정렬
    • 하지만 대부분 문제에서는 불필요

💡 핵심 포인트

  • 원본 배열을 유지해야 하면 Arrays.copyOf 사용
  • swap 구현 시 임시 변수 temp 필요
  • 성능 최적화는 이미 충분히 효율적임 → 가독성 & 안정성 중요