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
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(stdin)
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
ほかの言語では?言語別の解答を見る · 8 言語の解答
二つの変数の値を入れ替える書き方は言語ごとに違います。 Python a, b = b, a、JS・TS [a, b] = [b, a]、C# (a, b) = (b, a)、C++ std::swap(a, b) は一行で入れ替え、名前(文字列)でも身長(数)でも同じ形で書けます。 Java と Craykon は tmp = a; a = b; b = tmp; のように片方を一時変数に預けて三行で入れ替えます。 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; } コンソール.書く(앞이름 + " " + 앞키 + " " + 뒤이름 + " " + 뒤키);}コンソール.書く(바꾼수);