놀이터에 네모난 모래밭이 있고, 모래밭의 네 변은 가로축이나 세로축과 나란하다.
첫 줄에 모래밭에서 서로 마주 보는 두 꼭짓점의 좌표 x1, y1, x2, y2가 빈칸 하나씩 띄워 주어진다.
두 꼭짓점 가운데 어느 쪽이 먼저 주어질지는 정해져 있지 않아서, x1이 x2보다 클 수도 있고 y1이 y2보다 클 수도 있다.
둘째 줄에 공의 수 n이 주어지고, 다음 n줄에 공이 떨어진 자리의 좌표 x, y가 빈칸 하나로 띄워 주어진다.
공마다 모래밭 안이나 테두리 위에 떨어졌으면 "예", 모래밭 밖에 떨어졌으면 "아니요"를 한 줄에 출력하라.
공의 x가 x1과 x2 사이에 있고 y가 y1과 y2 사이에 있으면 안이나 테두리 위이다. 여기서 사이는 양 끝 값을 포함한다.
수 v가 두 수 a와 b 사이(양 끝 포함)에 있는지 참·거짓으로 돌려주는 함수를 만들어 가로와 세로에 한 번씩 쓰자.
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
참·거짓 함수는 조건식을 그대로 돌려주면 돼요. if (조건) return true; else return false;로 풀어 쓸 필요가 없어요. 돌려주는 타입: Python bool, JS·TS boolean, Java boolean, C# bool, C++ bool, C는 <stdbool.h>의 bool, 크레이콘은 돌려주기 뒤에 조건식을 써요. 같은 함수를 가로와 세로에 한 번씩 불러 &&(Python은 and)로 이어요. 함정 넷: ① 수학의 a ≤ v ≤ b를 그대로 쓸 수 있는 것은 Python뿐이에요(low <= v <= high). JS는 low <= v <= high를 오류 없이 받아들이지만 (low <= v) <= high로 읽어서, 앞 비교의 결과(0 또는 1)를 high와 견줘요. 그래서 high가 1 이상이면 늘 참이 돼요. C·C++도 같은 뜻으로 읽는데, gcc는 그대로 컴파일하고(-Wall을 켜야 경고가 나와요) 최근 clang은 오류로 막아요. Java와 C#은 boolean과 수를 견줄 수 없다며 컴파일하지 않고, TS도 TS2365 오류로 막고, 크레이콘도 "비교를 이어 쓸 수 없어요"라며 막아요. 이 언어들은 low <= v && v <= high로 둘로 나눠 써요. ② 꼭짓점이 뒤섞인 차례로 올 수 있으니 min(a, b)와 max(a, b)로 작은 쪽·큰 쪽을 먼저 정해요(크레이콘 수학.작은수, 수학.큰수). 예시는 x1 = 8이 x2 = 2보다 커요. ③ 테두리 위도 안이니 <가 아니라 <=예요. ④ 가로와 세로가 모두 맞아야 하니 ||가 아니라 &&예요.
Pythonmain.py · 13 줄
def between(v, a, b): """v가 a와 b 사이(양 끝 포함)에 있으면 True. a와 b는 어느 쪽이 커도 된다.""" return min(a, b) <= v <= max(a, b)x1, y1, x2, y2 = map(int, input().split())n = int(input())for _ in range(n): x, y = map(int, input().split()) if between(x, x1, x2) and between(y, y1, y2): print("예") else: print("아니요")
JavaScriptmain.js · 14 줄
// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v, a, b) { return Math.min(a, b) <= v && v <= Math.max(a, b);}const lines = require("fs").readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2] = lines[0].trim().split(/\s+/).map(Number);const n = Number(lines[1]);const out = [];for (let i = 0; i < n; i++) { const [x, y] = lines[2 + i].trim().split(/\s+/).map(Number); out.push(between(x, x1, x2) && between(y, y1, y2) ? "예" : "아니요");}console.log(out.join("\n"));
TypeScriptmain.ts · 16 줄
import { readFileSync } from "node:fs";// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v: number, a: number, b: number): boolean { return Math.min(a, b) <= v && v <= Math.max(a, b);}const lines: string[] = readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2]: number[] = lines[0].trim().split(/\s+/).map(Number);const n: number = Number(lines[1]);const out: string[] = [];for (let i = 0; i < n; i++) { const [x, y]: number[] = lines[2 + i].trim().split(/\s+/).map(Number); out.push(between(x, x1, x2) && between(y, y1, y2) ? "예" : "아니요");}console.log(out.join("\n"));
JavaMain.java · 20 줄
import java.util.Scanner;public class Main { // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다 static boolean between(int v, int a, int b) { return Math.min(a, b) <= v && v <= Math.max(a, b); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt(); int n = sc.nextInt(); StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { int x = sc.nextInt(), y = sc.nextInt(); out.append(between(x, x1, x2) && between(y, y1, y2) ? "예" : "아니요").append('\n'); } System.out.print(out); }}
C#Main.cs · 27 줄
using System;class Program{ // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다 static bool Between(int v, int a, int b) { return Math.Min(a, b) <= v && v <= Math.Max(a, b); } static int[] ReadInts() { return Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse); } static void Main() { int[] r = ReadInts(); int n = ReadInts()[0]; for (int i = 0; i < n; i++) { int[] ball = ReadInts(); bool inside = Between(ball[0], r[0], r[2]) && Between(ball[1], r[1], r[3]); Console.WriteLine(inside ? "예" : "아니요"); } }}
C++main.cpp · 17 줄
#include <algorithm>#include <iostream>// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) { return std::min(a, b) <= v && v <= std::max(a, b);}int main() { int x1, y1, x2, y2, n; std::cin >> x1 >> y1 >> x2 >> y2 >> n; for (int i = 0; i < n; i++) { int x, y; std::cin >> x >> y; std::cout << (between(x, x1, x2) && between(y, y1, y2) ? "예" : "아니요") << '\n'; }}
Cmain.c · 20 줄
#include <stdbool.h>#include <stdio.h>// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) { int low = a < b ? a : b; int high = a < b ? b : a; return low <= v && v <= high;}int main(void) { int x1, y1, x2, y2, n; if (scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n) != 5) return 0; for (int i = 0; i < n; i++) { int x, y; if (scanf("%d %d", &x, &y) != 2) return 0; puts(between(x, x1, x2) && between(y, y1, y2) ? "예" : "아니요"); } return 0;}
Craykonmain.cray · 20 줄
// v가 a와 b 사이(양 끝 포함)에 있으면 참. a와 b는 어느 쪽이 커도 된다사이인가(v, a, b){ 돌려주기 수학.작은수(a, b) <= v && v <= 수학.큰수(a, b);}r = 콘솔.수들읽기();n = 콘솔.줄읽기().수로변환();반복 (i = 0; i < n; i++){ ball = 콘솔.수들읽기(); 만약 (사이인가(ball[0], r[0], r[2]) && 사이인가(ball[1], r[1], r[3])) { 콘솔.쓰기("예"); } 아니면 { 콘솔.쓰기("아니요"); }}