{ }codelper
값 돌려주기함수 만들기P0402

눈금 밖으로 못 나가는 온도계

교실 온도계에는 lo도부터 hi도까지만 눈금이 있다. 실제 기온이 lo보다 낮으면 온도계는 lo를 가리키고, hi보다 높으면 hi를 가리킨다. 그 밖에는 실제 기온을 그대로 가리킨다. 첫 줄에 lo와 hi가 빈칸 하나로 띄워 주어진다. 둘째 줄에 기온을 잰 횟수 n이 주어진다. 다음 n줄에 실제 기온 t가 한 줄에 하나씩 주어진다. 잰 차례대로 온도계가 가리킨 값을 한 줄에 하나씩 출력하라. 마지막 줄에는 온도계가 가리킨 값 n개를 모두 더한 합을 출력하라. 실제 기온과 lo, hi를 받아 온도계가 가리키는 값을 돌려주는 함수를 만들고, 돌려받은 값을 출력과 합에 모두 쓰자. 채점은 출력만 본다.

입력
-100 ≤ lo ≤ hi ≤ 100, 1 ≤ n ≤ 100, -1,000 ≤ t ≤ 1,000 (모두 정수)
출력
n + 1줄.
처음 n줄은 온도계가 가리킨 값, 마지막 줄은 그 합
예시 1 · stdin
-5 30
4
12
-9
30
41
stdout
12
-5
30
30
67
main.py
입력(stdin)

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

$ 준비됐어요

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

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

함수를 만드는 틀이 언어마다 달라요.
Python은 def shown(t, lo, hi):, JS는 function shown(t, lo, hi)로 타입을 적지 않아요.
TS는 function shown(t: number, lo: number, hi: number): number처럼 괄호 뒤에 돌려주는 값의 타입을 적어요.
Java와 C#은 static int shown(int t, int lo, int hi)(C#은 흔히 Shown), C·C++는 int shown(int t, int lo, int hi)로 돌려주는 타입을 이름 앞에 써요.
크레이콘은 가리킨값(t, lo, hi) { … }처럼 이름과 괄호만 쓰고, 값은 돌려주기 t;로 돌려줘요.
return을 만나면 함수가 바로 끝나므로 if (t < lo) return lo; 아래에는 else를 쓰지 않아도 돼요.
함수를 두는 자리도 달라요.
Python은 부르는 줄보다 먼저 def가 실행되어 있어야 해서, 아래에 두면 NameError로 멈춰요.
C++는 부르는 곳보다 위에 함수가 없으면 컴파일 오류이고, C(gcc 11)는 경고만 내고 컴파일해요.
JS·TS의 function 선언, Java·C#의 메서드, 크레이콘 함수는 부르는 곳보다 아래에 있어도 돼요.
함정 하나: 눈금 안일 때의 마지막 return t;를 빠뜨리는 것이에요.
Python 함수는 return 없이 끝나면 None을 돌려줘서, 예시에서는 첫 줄에 None을 찍고 합을 더하는 줄에서 TypeError로 멈춰요.
JS는 undefined를 돌려주는데, 풀이처럼 join으로 이으면 undefined가 빈 문자열이 되어서 예시의 출력은 빈 줄, -5, 빈 줄, 30, NaN이에요.
Java는 "missing return statement", C#은 CS0161로 컴파일을 막아 주고, TS도 : number를 적었다면 TS2366으로 막아요.
C와 C++는 채점기의 gcc 11(-Wall)에서 경고만 내고 컴파일하며, 그 뒤의 동작은 정해져 있지 않아요.
함정 둘: 함수 안에서 값을 출력하고 돌려주지 않는 것이에요.
화면에 찍은 값은 부른 쪽으로 돌아오지 않아요.
크레이콘에서 돌려주기 대신 콘솔.쓰기(t)를 쓰면 예시에서 12 한 줄만 쓰고, 합을 더하는 줄에서 "빈값으로는 계산할 수 없어요"라며 멈춰요.
함정 셋: shown(t, lo, hi);로 부르기만 하고 돌려준 값을 받지 않는 것이에요.
여덟 언어 모두 정수는 값이 복사되어 넘어가서, 함수 안에서 t를 바꿔도 부른 쪽의 t는 그대로예요.
C에서 이렇게 쓰면 경고 없이 컴파일되고 예시의 출력은 12, -9, 30, 41, 74예요.
v = shown(t, lo, hi)처럼 돌려받은 값을 이름에 담아야 출력과 합에 두 번 쓸 수 있어요.

Pythonmain.py · 17 줄
def shown(t, lo, hi):    # 온도계가 가리키는 값을 돌려준다. return을 만나면 함수는 바로 끝난다    if t < lo:        return lo    if t > hi:        return hi    return t  lo, hi = map(int, input().split())n = int(input())total = 0for _ in range(n):    v = shown(int(input()), lo, hi)  # 돌려받은 값을 이름에 담아 두 번 쓴다    print(v)    total += vprint(total)
JavaScriptmain.js · 19 줄
// 온도계가 가리키는 값을 돌려준다. return을 만나면 함수는 바로 끝난다function shown(t, lo, hi) {  if (t < lo) return lo;  if (t > hi) return hi;  return t;} const lines = require("fs").readFileSync(0, "utf8").split("\n");const [lo, hi] = lines[0].trim().split(/\s+/).map(Number);const n = Number(lines[1]);const out = [];let total = 0;for (let i = 0; i < n; i++) {  const v = shown(Number(lines[2 + i]), lo, hi); // 돌려받은 값을 이름에 담아 두 번 쓴다  out.push(v);  total += v;}out.push(total);console.log(out.join("\n"));
TypeScriptmain.ts · 21 줄
import { readFileSync } from "node:fs"; // 온도계가 가리키는 값을 돌려준다. 괄호 뒤의 `: number`가 돌려주는 값의 타입이다function shown(t: number, lo: number, hi: number): number {  if (t < lo) return lo;  if (t > hi) return hi;  return t;} const lines: string[] = readFileSync(0, "utf8").split("\n");const [lo, hi]: number[] = lines[0].trim().split(/\s+/).map(Number);const n: number = Number(lines[1]);const out: number[] = [];let total = 0;for (let i = 0; i < n; i++) {  const v: number = shown(Number(lines[2 + i]), lo, hi); // 돌려받은 값을 이름에 담아 두 번 쓴다  out.push(v);  total += v;}out.push(total);console.log(out.join("\n"));
JavaMain.java · 25 줄
import java.util.Scanner; public class Main {    // 온도계가 가리키는 값을 돌려준다. 이름 앞의 int가 돌려주는 값의 타입이다    static int shown(int t, int lo, int hi) {        if (t < lo) return lo;        if (t > hi) return hi;        return t;    }     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int lo = sc.nextInt(), hi = sc.nextInt();        int n = sc.nextInt();        int total = 0;        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int v = shown(sc.nextInt(), lo, hi); // 돌려받은 값을 변수에 담아 두 번 쓴다            out.append(v).append('\n');            total += v;        }        out.append(total).append('\n');        System.out.print(out);    }}
C#Main.cs · 27 줄
using System; class Program{    // 온도계가 가리키는 값을 돌려준다. 이름 앞의 int가 돌려주는 값의 타입이다    static int Shown(int t, int lo, int hi)    {        if (t < lo) return lo;        if (t > hi) return hi;        return t;    }     static void Main()    {        string[] first = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int lo = int.Parse(first[0]), hi = int.Parse(first[1]);        int n = int.Parse(Console.ReadLine());        int total = 0;        for (int i = 0; i < n; i++)        {            int v = Shown(int.Parse(Console.ReadLine()), lo, hi); // 돌려받은 값을 변수에 담아 두 번 쓴다            Console.WriteLine(v);            total += v;        }        Console.WriteLine(total);    }}
C++main.cpp · 22 줄
#include <iostream> // 온도계가 가리키는 값을 돌려준다. 이름 앞의 int가 돌려주는 값의 타입이다int shown(int t, int lo, int hi) {    if (t < lo) return lo;    if (t > hi) return hi;    return t;} int main() {    int lo, hi, n;    std::cin >> lo >> hi >> n;    int total = 0;    for (int i = 0; i < n; i++) {        int t;        std::cin >> t;        int v = shown(t, lo, hi);  // 돌려받은 값을 변수에 담아 두 번 쓴다        std::cout << v << '\n';        total += v;    }    std::cout << total << '\n';}
Cmain.c · 23 줄
#include <stdio.h> // 온도계가 가리키는 값을 돌려준다. 이름 앞의 int가 돌려주는 값의 타입이다int shown(int t, int lo, int hi) {    if (t < lo) return lo;    if (t > hi) return hi;    return t;} int main(void) {    int lo, hi, n;    if (scanf("%d %d %d", &lo, &hi, &n) != 3) return 0;    int total = 0;    for (int i = 0; i < n; i++) {        int t;        if (scanf("%d", &t) != 1) return 0;        int v = shown(t, lo, hi);  // 돌려받은 값을 변수에 담아 두 번 쓴다        printf("%d\n", v);        total += v;    }    printf("%d\n", total);    return 0;}
Craykonmain.cray · 27 줄
// 온도계가 가리키는 값을 돌려준다. 돌려주기를 만나면 함수는 바로 끝난다가리킨값(t, lo, hi){    만약 (t < lo)    {        돌려주기 lo;    }    만약 (t > hi)    {        돌려주기 hi;    }    돌려주기 t;} ends = 콘솔.수들읽기();lo = ends[0];hi = ends[1];n = 콘솔.줄읽기().수로변환();total = 0;반복 (i = 0; i < n; i++){    // 돌려받은 값을 이름에 담아 두 번 쓴다    v = 가리킨값(콘솔.줄읽기().수로변환(), lo, hi);    콘솔.쓰기(v);    total = total + v;}콘솔.쓰기(total);