{ }codelper
값 바꾸기줄 안 바꾸고 출력P0133

정렬 네트워크 돌려 보기

정렬 네트워크는 정해진 차례로 두 자리씩 비교하고 바꾸는 장치다. 첫 줄에 수의 개수 n이 주어지고, 둘째 줄에 수 n개가 왼쪽부터 주어진다. 왼쪽부터 1번, 2번, …, n번 자리라 한다. 셋째 줄에 비교기의 수 m이 주어지고, 다음 m줄에 비교기가 하나씩 자리 번호 i, j(i < j)로 주어진다. 비교기를 주어진 차례대로 하나씩 쓴다. i번 자리의 수가 j번 자리의 수보다 크면 두 수를 맞바꾸고, 그렇지 않으면(같을 때도) 그대로 둔다. 첫째 줄에는 비교기마다 한 글자씩, 바꿨으면 "x", 그대로 두었으면 "."을 사이에 빈칸 없이 이어서 m글자를 출력하라. 둘째 줄에는 모든 비교기를 쓴 뒤의 수들을 왼쪽부터 빈칸 하나씩 띄어 출력하라. 셋째 줄에는 그 수들이 왼쪽부터 작아지지 않는 차례(같은 값은 이웃해도 됨)이면 "정렬됨", 아니면 "정렬 안 됨"를 출력하라.

입력
2 ≤ n ≤ 100, 수는 -1,000,000,000 이상 1,000,000,000 이하의 정수, 1 ≤ m ≤ 1,000, 1 ≤ i < j ≤ n
출력
세 줄: m글자의 x/.
표시, 마지막 수들, "정렬됨" 또는 "정렬 안 됨"
예시 1 · stdin
4
3 1 3 2
5
1 2
3 4
1 3
2 4
2 3
stdout
xx..x
1 2 3 3
정렬됨
예시 2 · stdin
3
2 1 0
2
1 2
2 3
stdout
xx
1 0 2
정렬 안 됨
main.py
입력(stdin)

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

$ 준비됐어요

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

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

두 값 맞바꾸기는 언어마다 모양이 달라요.
Python a[i], a[j] = a[j], a[i], JS·TS [a[i], a[j]] = [a[j], a[i]](구조 분해), C# (a[i], a[j]) = (a[j], a[i])(튜플), C++ std::swap(a[i], a[j])이에요.
Java·C·크레이콘에는 이런 한 줄이 없어서 t = a[i]; a[i] = a[j]; a[j] = t;처럼 임시 변수를 써요.
임시 변수 없이 a[i] = a[j]; a[j] = a[i];라고 쓰면 첫 줄에서 처음 a[i]가 지워져 두 칸이 같은 값이 돼요.
비교는 >여야 해요.
>=로 쓰면 같은 값도 바꿔서 마지막 수들은 같아 보여도 표시 줄에 x가 더 찍혀요.
줄 안 바꾸고 출력하기: Python print(c, end=""), JS·TS process.stdout.write(c)(console.log는 늘 줄을 바꿔요), Java System.out.print(println과 다름), C# Console.Write(WriteLine과 다름), C putchar·printf("%c"), C++ std::cout << c(std::endl을 붙이지 않음), 크레이콘 콘솔.이어쓰기(콘솔.쓰기는 줄을 바꿈)예요.
이어 쓴 다음에는 줄바꿈을 한 번 직접 써서 그 줄을 끝내야 둘째 줄이 따로 시작해요(Python print(), 크레이콘 콘솔.쓰기("")).

Pythonmain.py · 15 줄
n = int(input())a = list(map(int, input().split()))m = int(input())for _ in range(m):    i, j = map(int, input().split())    i -= 1    j -= 1    if a[i] > a[j]:        a[i], a[j] = a[j], a[i]  # 튜플로 한 번에 맞바꾼다        print("x", end="")  # end=""라야 줄을 바꾸지 않는다    else:        print(".", end="")print()  # 표시 줄을 끝낸다print(*a)print("정렬됨" if all(a[k] <= a[k + 1] for k in range(n - 1)) else "정렬 안 됨")
JavaScriptmain.js · 18 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "정렬됨" : "정렬 안 됨");
TypeScriptmain.ts · 19 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a: number[] = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "정렬됨" : "정렬 안 됨");
JavaMain.java · 39 줄
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        PrintWriter out = new PrintWriter(System.out);        int n = Integer.parseInt(in.readLine().trim());        int[] a = new int[n];        StringTokenizer st = new StringTokenizer(in.readLine());        for (int k = 0; k < n; k++) a[k] = Integer.parseInt(st.nextToken());        int m = Integer.parseInt(in.readLine().trim());        for (int k = 0; k < m; k++) {            st = new StringTokenizer(in.readLine());            int i = Integer.parseInt(st.nextToken()) - 1, j = Integer.parseInt(st.nextToken()) - 1;            if (a[i] > a[j]) {                int t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다                a[i] = a[j];                a[j] = t;                out.print('x'); // print는 줄을 바꾸지 않는다(println은 바꾼다)            } else {                out.print('.');            }        }        out.println();        boolean sorted = true;        StringBuilder row = new StringBuilder();        for (int k = 0; k < n; k++) {            if (k > 0) row.append(' ');            row.append(a[k]);            if (k + 1 < n && a[k] > a[k + 1]) sorted = false;        }        out.println(row);        out.println(sorted ? "정렬됨" : "정렬 안 됨");        out.flush();    }}
C#Main.cs · 31 줄
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int m = int.Parse(Console.ReadLine());        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;            if (a[i] > a[j])            {                (a[i], a[j]) = (a[j], a[i]); // 튜플로 맞바꾼다                Console.Write('x'); // Write는 줄을 바꾸지 않는다(WriteLine은 바꾼다)            }            else            {                Console.Write('.');            }        }        Console.WriteLine();        bool sorted = true;        for (int k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;        Console.WriteLine(string.Join(" ", a));        Console.WriteLine(sorted ? "정렬됨" : "정렬 안 됨");    }}
C++main.cpp · 25 줄
#include <algorithm>#include <iostream>#include <utility>#include <vector> int main() {    int n, m;    std::cin >> n;    std::vector<int> a(n);    for (int& v : a) std::cin >> v;    std::cin >> m;    for (int k = 0; k < m; k++) {        int i, j;        std::cin >> i >> j;        if (a[i - 1] > a[j - 1]) {            std::swap(a[i - 1], a[j - 1]); // 표준 라이브러리가 맞바꿔 준다            std::cout << 'x'; // endl이나 '\n'을 붙이지 않으면 줄이 이어진다        } else {            std::cout << '.';        }    }    std::cout << '\n';    for (int k = 0; k < n; k++) std::cout << (k ? " " : "") << a[k];    std::cout << '\n' << (std::is_sorted(a.begin(), a.end()) ? "정렬됨" : "정렬 안 됨") << '\n';}
Cmain.c · 32 줄
#include <stdbool.h>#include <stdio.h> int main(void) {    int n, m;    int a[100];    scanf("%d", &n);    for (int k = 0; k < n; k++) scanf("%d", &a[k]);    scanf("%d", &m);    for (int k = 0; k < m; k++) {        int i, j;        scanf("%d %d", &i, &j);        i--;        j--;        if (a[i] > a[j]) {            int t = a[i]; /* 임시 변수에 하나를 맡겨 두고 맞바꾼다 */            a[i] = a[j];            a[j] = t;            putchar('x'); /* 글자 하나만, 줄바꿈 없이 */        } else {            putchar('.');        }    }    putchar('\n');    bool sorted = true;    for (int k = 0; k < n; k++) {        printf(k ? " %d" : "%d", a[k]);        if (k + 1 < n && a[k] > a[k + 1]) sorted = false;    }    printf("\n%s\n", sorted ? "정렬됨" : "정렬 안 됨");    return 0;}
Craykonmain.cray · 31 줄
n = 콘솔.줄읽기().수로변환();a = 콘솔.수들읽기();m = 콘솔.줄읽기().수로변환();반복 (k = 0; k < m; k++){    ij = 콘솔.수들읽기();    i = ij[0] - 1;    j = ij[1] - 1;    만약 (a[i] > a[j])    {        t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다        a[i] = a[j];        a[j] = t;        콘솔.이어쓰기("x"); // 이어쓰기는 줄을 바꾸지 않는다    }    아니면    {        콘솔.이어쓰기(".");    }}콘솔.쓰기(""); // 표시 줄을 끝낸다정렬됨 = 참;반복 (k = 0; k + 1 < n; k++){    만약 (a[k] > a[k + 1])    {        정렬됨 = 거짓;    }}콘솔.쓰기(a);콘솔.쓰기(정렬됨 ? "정렬됨" : "정렬 안 됨");