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;
// }
// }