{ }codelper
값 바꾸기P0344

작은 사람이 앞에 서기

체육 시간에 학생들이 두 명씩 짝을 지어 앞뒤로 섰다. 첫 줄에 짝의 수 n이 주어진다. 이어지는 n줄에는 줄마다 한 짝의 앞사람 이름, 앞사람 키, 뒷사람 이름, 뒷사람 키가 이 순서대로 빈칸 하나로 띄워 주어진다. 앞사람의 키가 뒷사람의 키보다 크면 두 사람이 자리를 맞바꾼다. 두 사람의 키가 같으면 바꾸지 않는다. 짝마다 한 줄에 앞사람 이름, 앞사람 키, 뒷사람 이름, 뒷사람 키를 자리를 정리한 뒤의 모습대로 빈칸 하나로 띄워 출력하라. 마지막 줄에는 자리를 맞바꾼 짝의 수를 출력하라.

입력
1 ≤ n ≤ 100, 이름은 영어 소문자 1글자 이상 10글자 이하, 80 ≤ 키 ≤ 200(정수)
출력
n줄에 걸쳐 짝마다 이름, 키, 이름, 키를 빈칸 하나로 띄워 한 줄씩, 그다음 줄에 맞바꾼 짝의 수
예시 1 · stdin
3
mina 150 jun 142
bora 131 seo 131
tae 95 hana 120
stdout
jun 142 mina 150
bora 131 seo 131
tae 95 hana 120
1
예시 2 · stdin
1
yuna 99 dojun 100
stdout
yuna 99 dojun 100
0
main.py
입력(stdin)

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

$ 준비됐어요

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

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

두 변수의 값을 맞바꾸는 방법이 언어마다 달라요.
Python a, b = b, a, JS·TS [a, b] = [b, a], C# (a, b) = (b, a), C++ std::swap(a, b)는 한 줄로 바꾸고, 이름(문자열)도 키(수)도 같은 모양으로 써요.
Java와 크레이콘은 임시 = a; a = b; b = 임시;처럼 임시 변수에 한쪽을 맡겨 두고 세 줄로 바꿔요.
C도 임시 변수를 쓰는데, 이름을 담은 글자 배열은 =로 넣을 수 없어서 strcpy(tmp, a); strcpy(a, b); strcpy(b, tmp);로 글자를 옮겨요.
함정 하나: 임시 변수 없이 a = b; b = a;라고 쓰면 첫 줄에서 a의 원래 값이 사라져요.
예시 1의 첫 줄이 jun 142 jun 142가 돼요.
함정 둘: 한 사람은 이름과 키가 함께 움직여야 해요.
이름만 바꾸고 키를 그대로 두면 예시 1의 첫 줄이 jun 150 mina 142가 돼요.
함정 셋: 키가 같으면 바꾸지 않으므로 조건은 >예요.
>=로 쓰면 예시 1의 둘째 줄이 seo 131 bora 131이 되고 마지막 줄이 2가 돼요.
함정 넷: 키는 수로 바꾼 다음에 견줘요.
Python과 JS에서 읽은 문자열을 그대로 견주면 글자 순서로 견주어 "95" > "120"이 참이 돼요.
예시 1의 셋째 줄이 hana 120 tae 95가 되고, 예시 2도 dojun 100 yuna 99로 바뀌어요.

Pythonmain.py · 12 줄
n = int(input())swapped = 0for _ in range(n):    a, ha, b, hb = input().split()    ha, hb = int(ha), int(hb)   # 수로 바꿔야 키를 수로 견준다    if ha > hb:        # 오른쪽을 먼저 다 계산한 뒤에 넣으므로 임시 변수가 필요 없다        a, b = b, a        ha, hb = hb, ha        swapped += 1    print(a, ha, b, hb)print(swapped)
JavaScriptmain.js · 18 줄
const lines = require("fs").readFileSync(0, "utf8").trim().split("\n");const n = Number(lines[0]);const out = [];let swapped = 0;for (let i = 1; i <= n; i++) {  let [a, ha, b, hb] = lines[i].trim().split(/\s+/);  ha = Number(ha);  hb = Number(hb);  if (ha > hb) {    // 구조 분해로 한 줄에 맞바꾼다    [a, b] = [b, a];    [ha, hb] = [hb, ha];    swapped++;  }  out.push(`${a} ${ha} ${b} ${hb}`);}out.push(swapped);console.log(out.join("\n"));
TypeScriptmain.ts · 21 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").trim().split("\n");const n: number = Number(lines[0]);const out: string[] = [];let swapped: number = 0;for (let i = 1; i <= n; i++) {  const t: string[] = lines[i].trim().split(/\s+/);  let a: string = t[0];  let ha: number = Number(t[1]);  let b: string = t[2];  let hb: number = Number(t[3]);  if (ha > hb) {    // 구조 분해로 한 줄에 맞바꾼다    [a, b] = [b, a];    [ha, hb] = [hb, ha];    swapped++;  }  out.push(`${a} ${ha} ${b} ${hb}`);}out.push(String(swapped));console.log(out.join("\n"));
JavaMain.java · 29 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        StringBuilder sb = new StringBuilder();        int swapped = 0;        for (int i = 0; i < n; i++) {            String a = sc.next();            int ha = sc.nextInt();            String b = sc.next();            int hb = sc.nextInt();            if (ha > hb) {                // Java에는 한 줄 맞바꾸기가 없어 임시 변수에 한쪽을 맡겨 둔다                String tmpName = a;                a = b;                b = tmpName;                int tmpHeight = ha;                ha = hb;                hb = tmpHeight;                swapped++;            }            sb.append(a).append(' ').append(ha).append(' ').append(b).append(' ').append(hb).append('\n');        }        sb.append(swapped).append('\n');        System.out.print(sb);    }}
C#Main.cs · 25 줄
using System; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int swapped = 0;        for (int i = 0; i < n; i++)        {            string[] t = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            string a = t[0], b = t[2];            int ha = int.Parse(t[1]), hb = int.Parse(t[3]);            if (ha > hb)            {                // 튜플로 한 줄에 맞바꾼다                (a, b) = (b, a);                (ha, hb) = (hb, ha);                swapped++;            }            Console.WriteLine($"{a} {ha} {b} {hb}");        }        Console.WriteLine(swapped);    }}
C++main.cpp · 21 줄
#include <iostream>#include <string>#include <utility> int main() {    int n, swapped = 0;    std::cin >> n;    for (int i = 0; i < n; i++) {        std::string a, b;        int ha, hb;        std::cin >> a >> ha >> b >> hb;        if (ha > hb) {            // std::swap은 문자열도 수도 한 줄에 맞바꾼다            std::swap(a, b);            std::swap(ha, hb);            swapped++;        }        std::cout << a << " " << ha << " " << b << " " << hb << "\n";    }    std::cout << swapped << "\n";}
Cmain.c · 26 줄
#include <stdio.h>#include <string.h> int main(void) {    int n, swapped = 0;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        char a[11], b[11];   /* 이름 10글자 + 끝을 알리는 '\0' */        int ha, hb;        scanf("%10s %d %10s %d", a, &ha, b, &hb);        if (ha > hb) {            /* 배열은 =로 넣을 수 없어서 strcpy로 글자를 옮긴다 */            char tmp[11];            strcpy(tmp, a);            strcpy(a, b);            strcpy(b, tmp);            int t = ha;            ha = hb;            hb = t;            swapped++;        }        printf("%s %d %s %d\n", a, ha, b, hb);    }    printf("%d\n", swapped);    return 0;}
Craykonmain.cray · 23 줄
n = 콘솔.줄읽기().수로변환();바꾼수 = 0;반복 (i = 0; i < n; i++){    칸 = 콘솔.줄읽기().나누기(" ");    앞이름 = 칸[0];    앞키 = 칸[1].수로변환();    뒤이름 = 칸[2];    뒤키 = 칸[3].수로변환();    만약 (앞키 > 뒤키)    {        // 한쪽을 먼저 임시로 맡겨 둔다        임시 = 앞이름;        앞이름 = 뒤이름;        뒤이름 = 임시;        임시 = 앞키;        앞키 = 뒤키;        뒤키 = 임시;        바꾼수 += 1;    }    콘솔.쓰기(앞이름 + " " + 앞키 + " " + 뒤이름 + " " + 뒤키);}콘솔.쓰기(바꾼수);