{ }codelper
조건문P0254

정사각형 액자에 맞춘 사진

사진을 한 변이 S인 정사각형 액자에 넣으려고 한다. 사진은 가로와 세로의 비율을 지킨 채 크기를 바꾸고, 긴 변의 길이가 정확히 S가 되게 한다. 사진이 액자보다 작으면 늘리고, 크면 줄인다. 한 줄에 S, 사진의 가로 w, 세로 h가 빈칸 하나씩 띄워 주어진다. w가 h보다 크거나 같으면 새 가로는 S이고, 새 세로는 h × S를 w로 나눈 몫이다. 그렇지 않으면 새 세로는 S이고, 새 가로는 w × S를 h로 나눈 몫이다. 몫은 나눗셈에서 소수 부분을 버린 정수다(반올림하지 않는다). 새 가로와 새 세로를 이 차례로 빈칸 하나로 띄워 한 줄에 출력하라.

입력
1 ≤ S, w, h ≤ 10,000(정수).
긴 변은 짧은 변의 S배를 넘지 않는다(그래서 새 짧은 변은 1 이상이다)
출력
한 줄에 새 가로와 새 세로(정수 두 개)
예시 1 · stdin
1080 4000 3000
stdout
1080 810
예시 2 · stdin
500 600 900
stdout
333 500
main.py
입력(stdin)

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

$ 준비됐어요

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

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

두 갈래 가운데 하나만 고르는 if-else 문제예요.
쓰는 모양: Python if w >= h: … else:(콜론과 들여쓰기가 문법), C·C++·Java·C#·JS·TS if (w >= h) { … } else { … }, 크레이콘 만약 (w >= h) { … } 아니면 { … }.
조건을 빼먹고 가로가 늘 긴 변이라고 여기면 세로 사진(600 × 900)이 500 × 750이 되어 액자를 넘쳐요.
갈래 안의 계산에도 함정이 있어요.
첫째, 곱하기를 먼저 해요.
C·C++·Java·C#의 int /는 몫만 남겨서 h / w * S라고 쓰면 3000 / 4000이 먼저 0이 되어 답이 0이에요.
둘째, 몫만 남기는 방법이 달라요.
C 계열은 int끼리 /로 되지만, Python은 //(/는 810.0을 찍어요), JS·TS는 Math.floor(h * S / w), 크레이콘은 수학.몫(h * S, w)예요.
Math.round처럼 반올림하면 200 / 3 = 66.67이 67이 되어 틀려요.
곱한 값은 1억을 넘지 않아 32비트 int로 충분해요.
정사각형 사진(w = h)은 어느 갈래로 가도 S S예요.

Pythonmain.py · 6 줄
S, w, h = map(int, input().split())# 곱하기를 먼저 하고 //로 몫만 남긴다if w >= h:    print(S, h * S // w)else:    print(w * S // h, S)
JavaScriptmain.js · 6 줄
const [S, w, h] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);if (w >= h) {  console.log(`${S} ${Math.floor((h * S) / w)}`);} else {  console.log(`${Math.floor((w * S) / h)} ${S}`);}
TypeScriptmain.ts · 7 줄
import { readFileSync } from "node:fs";const [S, w, h]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);if (w >= h) {  console.log(`${S} ${Math.floor((h * S) / w)}`);} else {  console.log(`${Math.floor((w * S) / h)} ${S}`);}
JavaMain.java · 15 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int S = sc.nextInt();        int w = sc.nextInt();        int h = sc.nextInt();        if (w >= h) {            System.out.println(S + " " + h * S / w);        } else {            System.out.println(w * S / h + " " + S);        }    }}
C#Main.cs · 20 줄
using System; class Program{    static void Main()    {        string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int S = int.Parse(p[0]);        int w = int.Parse(p[1]);        int h = int.Parse(p[2]);        if (w >= h)        {            Console.WriteLine($"{S} {h * S / w}");        }        else        {            Console.WriteLine($"{w * S / h} {S}");        }    }}
C++main.cpp · 11 줄
#include <iostream> int main() {    int S, w, h;    std::cin >> S >> w >> h;    if (w >= h) {        std::cout << S << " " << h * S / w << "\n";    } else {        std::cout << w * S / h << " " << S << "\n";    }}
Cmain.c · 13 줄
#include <stdio.h> int main(void) {    int S, w, h;    scanf("%d %d %d", &S, &w, &h);    /* 곱해도 1억까지라 int로 충분하다 */    if (w >= h) {        printf("%d %d\n", S, h * S / w);    } else {        printf("%d %d\n", w * S / h, S);    }    return 0;}
Craykonmain.cray · 13 줄
p = 콘솔.줄읽기().공백제거().나누기(" ");S = p[0].수로변환();w = p[1].수로변환();h = p[2].수로변환();// 크레이콘의 /는 소수까지 나누니 수학.몫으로 몫만만약 (w >= h){    콘솔.쓰기(S + " " + 수학.몫(h * S, w));}아니면{    콘솔.쓰기(수학.몫(w * S, h) + " " + S);}