주차장이 차마다 세운 시간(분)으로 요금을 받는다.
먼저 세운 시간 m을 하루(1,440분) 단위로 나눈다.
하루를 다 채운 날마다 20,000원을 받는다.
남은 t분(m을 1,440으로 나눈 나머지)의 요금은 다음 규칙으로 정한다.
t가 30 이하이면 0원이다.
t가 30을 넘으면 기본 요금 2,000원을 받고, 이 기본 요금이 처음 60분까지를 덮는다.
t가 60을 넘으면 60분을 넘은 시간을 10분 단위로 묶어 한 묶음마다 500원을 더 받는다.
10분이 다 차지 않은 마지막 묶음도 한 묶음으로 친다.
남은 t분의 요금이 20,000원을 넘으면 20,000원만 받는다.
하루치 요금과 남은 t분의 요금을 더한 것이 할인 전 요금이다.
차 종류는 normal(일반), compact(경차), disabled(장애인) 셋 중 하나다.
disabled 차는 할인 전 요금의 80%를 깎아 5분의 1만 받는다.
compact 차는 m이 1,440 이하일 때만 할인 전 요금의 절반을 받고, m이 1,440을 넘으면 할인하지 않는다.
normal 차는 할인하지 않는다.
첫 줄에 차의 수 n이 주어지고, 다음 n줄에 차마다 종류와 m이 빈칸 하나를 사이에 두고 주어진다.
차마다 받을 요금을 원 단위 정수로 한 줄에 하나씩 입력 차례대로 출력하라.
입력
1 ≤ n ≤ 1,000, 0 ≤ m ≤ 100,000, 종류는 normal·compact·disabled 중 하나
출력
n줄, 줄마다 요금(정수)
예시 1 · stdin
5
normal 25
normal 95
compact 95
disabled 95
compact 1500
stdout
0
4000
2000
800
22000
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
규칙이 '종류 → 그 안에서 시간' 차례로 갈라지니 겹친 조건이 자연스러워요. compact 안에서 m <= 1440을 한 번 더 묻는 부분을 kind == "compact" && m <= 1440으로 합치면, 하루를 넘긴 경차가 다음 갈래로 내려가는 일이 없는지 따로 따져야 해요(이 문제에서는 마지막이 '할인 없음'이라 같은 답이지만, 갈래가 늘면 쉽게 틀려요). else-if는 Python elif, C 계열·JS·TS else if, 크레이콘 아니면 만약이에요. 가장 흔한 함정은 10분 묶음의 올림이에요. 정수 나눗셈은 버리니 (t - 60 + 9) / 10(Python //)처럼 9를 더해 올려요. JS·TS와 크레이콘은 /가 실수 나눗셈이라 Math.ceil((t - 60) / 10), 수학.올림((t - 60) / 10)로 써요. 최대 요금 20,000원을 머문 시간 전체에 한 번만 씌우면 이틀 넘게 세운 차가 20,000원만 내게 돼요. 하루치를 먼저 떼고 남은 분에만 씌워요. 하나씩 도는 반복: Python for kind, m in cars(두 값으로 풀어 받기), Java for (String car : cars), C# foreach (string car in cars), C++ for (const auto& [kind, m] : cars), JS·TS for (const [kind, m] of cars)(in이 아니라 of), 크레이콘 각각 (차 에서 차들). C에는 for-each가 없어 번호로 돌아요. 문자열 같음은 Java equals, C strcmp(a, b) == 0이고 나머지는 ==(JS·TS ===)예요.
Pythonmain.py · 27 줄
import sysdef part_fee(t): """하루가 안 되는 t분의 요금.""" if t <= 30: return 0 fee = 2000 if t > 60: fee += (t - 60 + 9) // 10 * 500 # 다 차지 않은 10분도 10분으로: 올림 return min(fee, 20000)lines = sys.stdin.read().split("\n")n = int(lines[0])cars = [line.split() for line in lines[1:n + 1]]out = []for kind, minutes in cars: m = int(minutes) fee = m // 1440 * 20000 + part_fee(m % 1440) if kind == "disabled": fee = fee // 5 # 80% 할인 = 5분의 1 elif kind == "compact": if m <= 1440: # 하루를 넘기면 경차 할인이 없다 fee = fee // 2 out.append(str(fee))print("\n".join(out))
JavaScriptmain.js · 28 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");// 하루가 안 되는 t분의 요금function partFee(t) { if (t <= 30) return 0; let fee = 2000; if (t > 60) { fee += Math.ceil((t - 60) / 10) * 500; // 다 차지 않은 10분도 10분으로 } return Math.min(fee, 20000);}const n = Number(lines[0]);const cars = lines.slice(1, n + 1).map((line) => line.trim().split(/\s+/));const out = [];for (const [kind, minutes] of cars) { const m = Number(minutes); let fee = Math.floor(m / 1440) * 20000 + partFee(m % 1440); if (kind === "disabled") { fee = fee / 5; // 80% 할인. fee는 500의 배수라 나누어떨어진다 } else if (kind === "compact") { if (m <= 1440) { fee = fee / 2; // 하루를 넘기면 경차 할인이 없다 } } out.push(fee);}console.log(out.join("\n"));
TypeScriptmain.ts · 29 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");// 하루가 안 되는 t분의 요금function partFee(t: number): number { if (t <= 30) return 0; let fee = 2000; if (t > 60) { fee += Math.ceil((t - 60) / 10) * 500; // 다 차지 않은 10분도 10분으로 } return Math.min(fee, 20000);}const n: number = Number(lines[0]);const cars: string[][] = lines.slice(1, n + 1).map((line) => line.trim().split(/\s+/));const out: number[] = [];for (const [kind, minutes] of cars) { const m: number = Number(minutes); let fee: number = Math.floor(m / 1440) * 20000 + partFee(m % 1440); if (kind === "disabled") { fee = fee / 5; // 80% 할인. fee는 500의 배수라 나누어떨어진다 } else if (kind === "compact") { if (m <= 1440) { fee = fee / 2; // 하루를 넘기면 경차 할인이 없다 } } out.push(fee);}console.log(out.join("\n"));
JavaMain.java · 38 줄
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOException;public class Main { // 하루가 안 되는 t분의 요금 static int partFee(int t) { if (t <= 30) return 0; int fee = 2000; if (t > 60) { fee += (t - 60 + 9) / 10 * 500; // 다 차지 않은 10분도 10분으로: 올림 } return Math.min(fee, 20000); } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); String[] cars = new String[n]; for (int i = 0; i < n; i++) cars[i] = br.readLine().trim(); StringBuilder out = new StringBuilder(); for (String car : cars) { String[] p = car.split("\\s+"); String kind = p[0]; int m = Integer.parseInt(p[1]); int fee = m / 1440 * 20000 + partFee(m % 1440); if (kind.equals("disabled")) { fee = fee / 5; // 80% 할인 = 5분의 1 } else if (kind.equals("compact")) { if (m <= 1440) { fee = fee / 2; // 하루를 넘기면 경차 할인이 없다 } } out.append(fee).append('\n'); } System.out.print(out); }}
C#Main.cs · 46 줄
using System;using System.Collections.Generic;using System.Text;class Program{ // 하루가 안 되는 t분의 요금 static int PartFee(int t) { if (t <= 30) return 0; int fee = 2000; if (t > 60) { fee += (t - 60 + 9) / 10 * 500; // 다 차지 않은 10분도 10분으로: 올림 } return Math.Min(fee, 20000); } static void Main() { int n = int.Parse(Console.ReadLine().Trim()); var cars = new List<string>(); for (int i = 0; i < n; i++) cars.Add(Console.ReadLine().Trim()); var out_ = new StringBuilder(); foreach (string car in cars) { string[] p = car.Split(' ', StringSplitOptions.RemoveEmptyEntries); string kind = p[0]; int m = int.Parse(p[1]); int fee = m / 1440 * 20000 + PartFee(m % 1440); if (kind == "disabled") { fee = fee / 5; // 80% 할인 = 5분의 1 } else if (kind == "compact") { if (m <= 1440) { fee = fee / 2; // 하루를 넘기면 경차 할인이 없다 } } out_.Append(fee).Append('\n'); } Console.Write(out_); }}
C++main.cpp · 33 줄
#include <algorithm>#include <iostream>#include <string>#include <utility>#include <vector>// 하루가 안 되는 t분의 요금int partFee(int t) { if (t <= 30) return 0; int fee = 2000; if (t > 60) { fee += (t - 60 + 9) / 10 * 500; // 다 차지 않은 10분도 10분으로: 올림 } return std::min(fee, 20000);}int main() { int n; std::cin >> n; std::vector<std::pair<std::string, int>> cars(n); for (auto& car : cars) std::cin >> car.first >> car.second; for (const auto& [kind, m] : cars) { int fee = m / 1440 * 20000 + partFee(m % 1440); if (kind == "disabled") { fee = fee / 5; // 80% 할인 = 5분의 1 } else if (kind == "compact") { if (m <= 1440) { fee = fee / 2; // 하루를 넘기면 경차 할인이 없다 } } std::cout << fee << '\n'; }}
Cmain.c · 32 줄
#include <stdio.h>#include <string.h>/* 하루가 안 되는 t분의 요금 */int part_fee(int t) { if (t <= 30) return 0; int fee = 2000; if (t > 60) { fee += (t - 60 + 9) / 10 * 500; /* 다 차지 않은 10분도 10분으로: 올림 */ } return fee < 20000 ? fee : 20000;}int main(void) { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { char kind[16]; int m; scanf("%15s %d", kind, &m); int fee = m / 1440 * 20000 + part_fee(m % 1440); if (strcmp(kind, "disabled") == 0) { fee = fee / 5; /* 80% 할인 = 5분의 1 */ } else if (strcmp(kind, "compact") == 0) { if (m <= 1440) { fee = fee / 2; /* 하루를 넘기면 경차 할인이 없다 */ } } printf("%d\n", fee); } return 0;}
Craykonmain.cray · 39 줄
// 하루가 안 되는 t분의 요금부분요금(t){ 만약 (t <= 30) { 돌려주기 0; } 요금 = 2000; 만약 (t > 60) { 요금 += 수학.올림((t - 60) / 10) * 500; // /는 실수 나눗셈이라 올림으로 묶음 수를 센다 } 돌려주기 수학.작은수(요금, 20000);}n = 콘솔.줄읽기().수로변환();차들 = [];반복 (i = 0; i < n; i++){ 차들.넣기(콘솔.줄읽기().공백제거().나누기());}각각 (차 에서 차들){ 종류 = 차[0]; m = 차[1].수로변환(); 요금 = 수학.몫(m, 1440) * 20000 + 부분요금(m % 1440); 만약 (종류 == "disabled") { 요금 = 요금 / 5; // 80% 할인. 요금은 500의 배수라 나누어떨어진다 } 아니면 만약 (종류 == "compact") { 만약 (m <= 1440) { 요금 = 요금 / 2; // 하루를 넘기면 경차 할인이 없다 } } 콘솔.쓰기(요금);}