정렬 네트워크는 정해진 차례로 두 자리씩 비교하고 바꾸는 장치다.
첫 줄에 수의 개수 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
오류 목록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]](구조 분해), 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);콘솔.쓰기(정렬됨 ? "정렬됨" : "정렬 안 됨");