카드 n장이 한 줄로 놓여 있고, 왼쪽부터 1번, 2번, … n번 자리다. 첫 줄에 n과 바꾸기 횟수 m이 주어지고, 둘째 줄에 카드에 적힌 수 n개가 왼쪽부터 주어진다. 다음 m줄에는 한 줄에 자리 번호 두 개 i와 j가 주어진다. 주어진 차례대로 i번 자리 카드와 j번 자리 카드를 서로 바꾼다(i와 j가 같으면 아무 일도 없다). 모두 바꾼 뒤 카드에 적힌 수를 왼쪽부터 빈칸 하나로 띄어 한 줄에 출력하라.
입력
1 ≤ n ≤ 1,000, 1 ≤ m ≤ 1,000, 1 ≤ 카드의 수 ≤ 1,000,000,000, 1 ≤ i, j ≤ n
출력
카드 n장의 수, 한 줄
예시 1 · stdin
4 3
10 20 30 40
1 4
2 3
1 2
stdout
30 40 20 10
예시 2 · stdin
3 3
3 3 8
1 2
2 2
3 1
stdout
8 3 3
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
두 값을 바꾸는 한 줄 문법이 있는 언어와 없는 언어로 나뉘어요. Python a[i], a[j] = a[j], a[i](오른쪽 튜플을 다 만든 뒤 나눠 담아요), JS·TS [a[i], a[j]] = [a[j], a[i]](구조 분해 — 앞 줄 끝에 ;가 없으면 x\n[a[i], …]가 x[…]로 이어져 읽히니 조심), C# (a[i], a[j]) = (a[j], a[i])(튜플, C# 7부터), C++ std::swap(a[i], a[j]). Java·C·크레이콘에는 이런 문법이 없어 임시 변수를 써요: tmp = a[i]; a[i] = a[j]; a[j] = tmp;. 가장 흔한 함정은 임시 변수 없이 a[i] = a[j]; a[j] = a[i];라고 쓰는 것 — 첫 줄에서 a[i]의 원래 값이 사라져 두 칸이 같아져요. 둘째 함정은 바꾸기를 함수로 빼는 것: Java swap(int x, int y)와 C swap(int x, int y)는 값의 복사본을 받아서 배열은 그대로예요. C는 포인터 swap(int *x, int *y), Java는 배열과 두 번호를 넘겨야 하고, C++는 참조 int&라서 std::swap이 돼요. 셋째는 XOR 묘기 x ^= y; y ^= x; x ^= y;: i와 j가 같은 칸이면 자기 자신과 XOR 해서 0이 돼요 — 예시 2처럼 같은 자리를 바꾸는 줄이 있어요.
Pythonmain.py · 7 줄
n, m = map(int, input().split())cards = list(map(int, input().split()))for _ in range(m): i, j = map(int, input().split()) # 오른쪽이 먼저 다 계산된 뒤 왼쪽에 담기므로 임시 변수가 필요 없다 cards[i - 1], cards[j - 1] = cards[j - 1], cards[i - 1]print(*cards)
JavaScriptmain.js · 9 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const [n, m] = lines[0].trim().split(/\s+/).map(Number);const cards = lines[1].trim().split(/\s+/).map(Number);for (let k = 0; k < m; k++) { const [i, j] = lines[2 + k].trim().split(/\s+/).map((s) => Number(s) - 1); // 구조 분해 대입: 오른쪽 배열을 먼저 만든 뒤 나눠 담는다 [cards[i], cards[j]] = [cards[j], cards[i]];}console.log(cards.join(" "));
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const [n, m]: number[] = lines[0].trim().split(/\s+/).map(Number);const cards: number[] = lines[1].trim().split(/\s+/).map(Number);for (let k = 0; k < m; k++) { const [i, j]: number[] = lines[2 + k].trim().split(/\s+/).map((s) => Number(s) - 1); // 구조 분해 대입: 오른쪽 배열을 먼저 만든 뒤 나눠 담는다 [cards[i], cards[j]] = [cards[j], cards[i]];}console.log(cards.join(" "));
JavaMain.java · 31 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); int[] cards = new int[n]; st = new StringTokenizer(in.readLine()); for (int k = 0; k < n; k++) cards[k] = Integer.parseInt(st.nextToken()); for (int k = 0; k < m; k++) { st = new StringTokenizer(in.readLine()); int i = Integer.parseInt(st.nextToken()) - 1; int j = Integer.parseInt(st.nextToken()) - 1; // Java에는 한 줄 바꾸기가 없어 임시 변수를 쓴다 int tmp = cards[i]; cards[i] = cards[j]; cards[j] = tmp; } StringBuilder out = new StringBuilder(); for (int k = 0; k < n; k++) { if (k > 0) out.append(' '); out.append(cards[k]); } System.out.println(out); }}
C#Main.cs · 19 줄
using System;using System.Linq;class Program{ static void Main() { int m = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray()[1]; int[] cards = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); for (int k = 0; k < m; k++) { int[] ij = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); int i = ij[0] - 1, j = ij[1] - 1; // 튜플로 한 번에 바꾼다(C# 7부터) (cards[i], cards[j]) = (cards[j], cards[i]); } Console.WriteLine(string.Join(" ", cards)); }}
C++main.cpp · 17 줄
#include <iostream>#include <utility>#include <vector>int main() { int n, m; std::cin >> n >> m; std::vector<int> cards(n); for (int& c : cards) std::cin >> c; for (int k = 0; k < m; k++) { int i, j; std::cin >> i >> j; std::swap(cards[i - 1], cards[j - 1]); // 참조로 받아 바꾼다 } for (int k = 0; k < n; k++) std::cout << (k ? " " : "") << cards[k]; std::cout << '\n';}
Cmain.c · 19 줄
#include <stdio.h>int main(void) { int n, m; static int cards[1000]; scanf("%d %d", &n, &m); for (int k = 0; k < n; k++) scanf("%d", &cards[k]); for (int k = 0; k < m; k++) { int i, j; scanf("%d %d", &i, &j); /* 임시 변수에 한쪽을 먼저 맡겨 둔다 */ int tmp = cards[i - 1]; cards[i - 1] = cards[j - 1]; cards[j - 1] = tmp; } for (int k = 0; k < n; k++) printf(k ? " %d" : "%d", cards[k]); printf("\n"); return 0;}
Craykonmain.cray · 14 줄
첫줄 = 콘솔.수들읽기();m = 첫줄[1];카드 = 콘솔.수들읽기();반복 (k = 0; k < m; k++){ 자리 = 콘솔.수들읽기(); i = 자리[0] - 1; j = 자리[1] - 1; // 한쪽을 먼저 임시로 맡겨 둔다 임시 = 카드[i]; 카드[i] = 카드[j]; 카드[j] = 임시;}콘솔.쓰기(카드);