{ }codelper
실수 나눗셈P0314

자유투 성공률 기록지

농구부 기록지에 선수 n명의 자유투 기록이 적혀 있다. 첫 줄에 n이 주어진다. 다음 n개의 줄에 선수마다 넣은 횟수 m과 던진 횟수 t가 빈칸 하나로 띄워 주어진다. 선수의 성공률은 m을 t로 나눈 값에 100을 곱한 값이다. 선수마다 한 줄씩, 주어진 차례대로 성공률을 소수 첫째 자리까지 반올림해 출력하라. 소수 첫째 자리는 0이어도 꼭 적고(50.0, 100.0), 퍼센트 기호는 붙이지 않는다. 한 번도 던지지 않은 선수(t가 0)는 성공률을 정할 수 없으므로 그 줄에는 빼기 기호 - 하나만 출력한다.

입력
1 ≤ n ≤ 100, 0 ≤ m ≤ t ≤ 1000(모두 정수).
성공률에 10을 곱한 값의 소수 부분이 정확히 0.5인 입력은 주어지지 않는다
출력
n개의 줄.
줄마다 소수 첫째 자리까지의 성공률 또는 -
예시 1 · stdin
4
1 2
2 3
0 0
7 7
stdout
50.0
66.7
-
100.0
main.py
입력(stdin)

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

$ 준비됐어요

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

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

정수 둘을 나눌 때 /가 하는 일이 언어마다 달라요.
C·C++·Java·C#에서 int끼리의 /는 몫만 남겨요.
그래서 m / t * 100은 2 3에서 2 / 3이 먼저 0이 되어 0.0이 찍혀요(예시의 1 2도 0.0).
순서를 바꾼 m * 100 / t도 int끼리라 66이 되어 66.0이 찍혀요.
나누기 전에 한쪽을 (double) m처럼 실수로 바꿔야 해요.
답을 double 변수에 담는 것만으로는 늦어요.
Python 3의 /는 정수끼리도 소수까지 나누고, 몫만 남기는 것은 //예요.
m * 100 // t라고 쓰면 여기서도 66.0이 돼요.
JS·TS는 수가 한 종류라 /가 늘 소수까지 나누고, 크레이콘의 /도 그래요.
0으로 나눌 때도 달라요.
t가 0인지 묻지 않으면 Python은 ZeroDivisionError로 멈춰요.
JS·TS는 오류 없이 0 / 0이 NaN이 되어 NaN이 그대로 찍혀요.
C·C++·Java·C#도 실수로 바꾼 뒤의 0 / 0은 오류가 아니라 '수가 아님'이라는 값이 되어 C에서는 nan(환경에 따라 -nan)이 찍혀요.
크레이콘도 0 / 0은 수가 아닌 값이 되고, 글자.소수자리맞추기가 그 값을 받으면 멈춰요.
어느 언어든 나누기 전에 t가 0인지 먼저 물어야 해요.
이때 0.0을 찍는 것도 틀려요.
던지지 않은 선수의 성공률은 0이 아니라 정할 수 없는 값이라 -를 찍어요.
소수 첫째 자리까지 맞추는 방법은 Python f"{x:.1f}", JS·TS x.toFixed(1), C printf("%.1f"), C++ std::fixed << std::setprecision(1), Java String.format("%.1f", x), C# x.ToString("F1"), 크레이콘 글자.소수자리맞추기(x, 1)이에요.
맞추지 않고 그냥 찍으면 JS에서는 50과 66.66666666666666이 나와요.

Pythonmain.py · 8 줄
n = int(input())for _ in range(n):    m, t = map(int, input().split())    if t == 0:        print("-")   # 0으로 나누면 ZeroDivisionError — 나누기 전에 먼저 묻는다    else:        # Python 3의 /는 정수끼리도 소수까지 나눈다(//는 몫만)        print(f"{m / t * 100:.1f}")
JavaScriptmain.js · 9 줄
const [n, ...v] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];for (let i = 0; i < n; i++) {  const m = v[2 * i];  const t = v[2 * i + 1];  // JS의 0 / 0은 오류가 아니라 NaN이다 — 나누기 전에 먼저 묻는다  out.push(t === 0 ? "-" : ((m / t) * 100).toFixed(1));}console.log(out.join("\n"));
TypeScriptmain.ts · 10 줄
import { readFileSync } from "node:fs";const [n, ...v]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: string[] = [];for (let i = 0; i < n; i++) {  const m: number = v[2 * i];  const t: number = v[2 * i + 1];  // 0 / 0은 오류가 아니라 NaN이다 — 나누기 전에 먼저 묻는다  out.push(t === 0 ? "-" : ((m / t) * 100).toFixed(1));}console.log(out.join("\n"));
JavaMain.java · 22 줄
import java.util.Locale;import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int m = sc.nextInt();            int t = sc.nextInt();            if (t == 0) {                out.append("-\n");            } else {                // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다                double rate = (double) m / t * 100;                out.append(String.format(Locale.ROOT, "%.1f", rate)).append('\n');            }        }        System.out.print(out);    }}
C#Main.cs · 29 줄
using System;using System.Globalization;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int m = int.Parse(p[0]);            int t = int.Parse(p[1]);            if (t == 0)            {                sb.Append("-\n");            }            else            {                // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다                double rate = (double)m / t * 100;                sb.Append(rate.ToString("F1", CultureInfo.InvariantCulture)).Append('\n');            }        }        Console.Write(sb);    }}
C++main.cpp · 19 줄
#include <iomanip>#include <iostream> int main() {    int n;    std::cin >> n;    std::cout << std::fixed << std::setprecision(1);    for (int i = 0; i < n; i++) {        int m, t;        std::cin >> m >> t;        if (t == 0) {            std::cout << "-\n";        } else {            // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다            double rate = static_cast<double>(m) / t * 100;            std::cout << rate << "\n";        }    }}
Cmain.c · 18 줄
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        int m, t;        scanf("%d %d", &m, &t);        if (t == 0) {            puts("-");        } else {            /* 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다 */            double rate = (double)m / t * 100;            printf("%.1f\n", rate);        }    }    return 0;}
Craykonmain.cray · 16 줄
n = 콘솔.줄읽기().수로변환();반복 (i = 0; i < n; i++){    기록 = 콘솔.수들읽기();    m = 기록[0];    t = 기록[1];    만약 (t == 0)    {        콘솔.쓰기("-");    }    아니면    {        // 크레이콘의 /는 늘 소수까지 나눈다        콘솔.쓰기(글자.소수자리맞추기(m / t * 100, 1));    }}