{ }codelper
자리 바꾸기P0312

둘씩 짝지어 자리 바꾸기

체조 시간에 학생 n명이 한 줄로 서 있고, 자리 번호는 왼쪽부터 1, 2, …, n이다. 첫 줄에 n과 s가 빈칸 하나로 띄워 주어진다. 둘째 줄에 학생들의 등번호 n개가 자리 순서대로 빈칸 하나씩 띄워 주어진다. 선생님이 호루라기를 불면 s번 자리부터 오른쪽으로 두 명씩 차례로 짝을 짓는다. 곧 s번과 s+1번 자리가 짝이고, s+2번과 s+3번 자리가 짝이고, 이렇게 줄 끝까지 이어진다. 짝이 된 두 학생은 서로 자리를 맞바꾼다. 짝이 없는 학생은 제자리에 그대로 있는다. s가 2일 때의 1번 자리 학생과, 줄 끝에 혼자 남는 학생이 짝이 없는 학생이다. 자리를 바꾼 뒤의 등번호를 자리 순서대로 빈칸 하나씩 띄워 한 줄에 출력하라.

입력
1 ≤ n ≤ 100, s는 1 또는 2, 1 ≤ 등번호 ≤ 999(정수), 등번호는 서로 다르다
출력
등번호 n개를 빈칸 하나씩 띄운 한 줄
예시 1 · stdin
5 1
10 20 30 40 50
stdout
20 10 40 30 50
예시 2 · stdin
5 2
10 20 30 40 50
stdout
10 30 20 50 40
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

두 칸을 맞바꾸는 방법이 언어마다 달라요.
Python a[i], a[i + 1] = a[i + 1], a[i], JS·TS [a[i], a[i + 1]] = [a[i + 1], a[i]], C# (a[i], a[i + 1]) = (a[i + 1], a[i]), C++ std::swap(a[i], a[i + 1])은 한 줄로 바꿔요.
C·Java·크레이콘은 임시 변수에 한쪽을 맡겨 두고 세 줄로 바꿔요.
첫째 함정은 임시 변수 없이 a[i] = a[i + 1]; a[i + 1] = a[i];라고 쓰는 것이에요.
첫 줄에서 a[i]의 원래 값이 사라져서 예시 1이 20 20 40 40 50이 돼요.
둘째 함정은 반복의 끝이에요.
짝의 오른쪽 칸 i + 1이 목록 안에 있어야 하므로 조건은 i + 1 < n이에요.
i < n으로 돌면 혼자 남은 마지막 학생이 목록 밖의 칸과 바뀌어요.
예시 1에서 Python은 IndexError로, 크레이콘은 '목록에는 0~4번만 있어요'라는 말과 함께 멈춰요.
JS는 오류 없이 없는 칸의 undefined와 맞바꿔서 목록이 한 칸 늘어나고, 20 10 40 30 뒤에 빈칸 두 개와 50이 찍혀요.
C·C++은 범위를 검사하지 않아서 오류 없이 엉뚱한 값을 읽어 올 수 있어요.
셋째 함정은 번호예요.
자리 번호 s는 1부터 세고 목록의 칸 번호는 0부터 세므로 s − 1번 칸에서 시작해요.
s를 그대로 쓰면 한 칸 밀리고, s를 보지 않고 늘 맨 앞에서 시작하면 예시 2가 20 10 40 30 50이 돼요.

Pythonmain.py · 6 줄
n, s = map(int, input().split())a = list(map(int, input().split()))# 자리 번호 s는 1부터 세므로 목록에서는 s - 1번 칸이다for i in range(s - 1, n - 1, 2):    a[i], a[i + 1] = a[i + 1], a[i]   # 임시 변수 없이 한 줄로 맞바꾼다print(*a)
JavaScriptmain.js · 6 줄
const [n, s, ...a] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 짝의 오른쪽 칸(i + 1)이 목록 안에 있을 때만 바꾼다for (let i = s - 1; i + 1 < n; i += 2) {  [a[i], a[i + 1]] = [a[i + 1], a[i]];}console.log(a.join(" "));
TypeScriptmain.ts · 7 줄
import { readFileSync } from "node:fs";const [n, s, ...a]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 짝의 오른쪽 칸(i + 1)이 목록 안에 있을 때만 바꾼다for (let i = s - 1; i + 1 < n; i += 2) {  [a[i], a[i + 1]] = [a[i + 1], a[i]];}console.log(a.join(" "));
JavaMain.java · 22 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int s = sc.nextInt();        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        for (int i = s - 1; i + 1 < n; i += 2) {            int tmp = a[i];      // 한쪽을 먼저 맡겨 둔다            a[i] = a[i + 1];            a[i + 1] = tmp;        }        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            if (i > 0) out.append(' ');            out.append(a[i]);        }        System.out.println(out);    }}
C#Main.cs · 17 줄
using System; class Program{    static void Main()    {        string[] first = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int n = int.Parse(first[0]);        int s = int.Parse(first[1]);        int[] a = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        for (int i = s - 1; i + 1 < n; i += 2)        {            (a[i], a[i + 1]) = (a[i + 1], a[i]);   // 튜플로 한 줄에 맞바꾼다        }        Console.WriteLine(string.Join(" ", a));    }}
C++main.cpp · 15 줄
#include <iostream>#include <utility>#include <vector> int main() {    int n, s;    std::cin >> n >> s;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    for (int i = s - 1; i + 1 < n; i += 2) {        std::swap(a[i], a[i + 1]);    }    for (int i = 0; i < n; i++) std::cout << (i ? " " : "") << a[i];    std::cout << "\n";}
Cmain.c · 15 줄
#include <stdio.h> int main(void) {    int n, s, a[100];    scanf("%d %d", &n, &s);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);    for (int i = s - 1; i + 1 < n; i += 2) {        int tmp = a[i];      /* 한쪽을 먼저 맡겨 둔다 */        a[i] = a[i + 1];        a[i + 1] = tmp;    }    for (int i = 0; i < n; i++) printf(i ? " %d" : "%d", a[i]);    printf("\n");    return 0;}
Craykonmain.cray · 12 줄
첫줄 = 콘솔.수들읽기();n = 첫줄[0];s = 첫줄[1];a = 콘솔.수들읽기();반복 (i = s - 1; i + 1 < n; i += 2){    // 한쪽을 먼저 임시로 맡겨 둔다    임시 = a[i];    a[i] = a[i + 1];    a[i + 1] = 임시;}콘솔.쓰기(a);