{ }codelper
참·거짓 함수P0285

모래밭 안에 떨어진 공

놀이터에 네모난 모래밭이 있고, 모래밭의 네 변은 가로축이나 세로축과 나란하다. 첫 줄에 모래밭에서 서로 마주 보는 두 꼭짓점의 좌표 x1, y1, x2, y2가 빈칸 하나씩 띄워 주어진다. 두 꼭짓점 가운데 어느 쪽이 먼저 주어질지는 정해져 있지 않아서, x1이 x2보다 클 수도 있고 y1이 y2보다 클 수도 있다. 둘째 줄에 공의 수 n이 주어지고, 다음 n줄에 공이 떨어진 자리의 좌표 x, y가 빈칸 하나로 띄워 주어진다. 공마다 모래밭 안이나 테두리 위에 떨어졌으면 "예", 모래밭 밖에 떨어졌으면 "아니요"를 한 줄에 출력하라. 공의 x가 x1과 x2 사이에 있고 y가 y1과 y2 사이에 있으면 안이나 테두리 위이다.
여기서 사이는 양 끝 값을 포함한다. 수 v가 두 수 a와 b 사이(양 끝 포함)에 있는지 참·거짓으로 돌려주는 함수를 만들어 가로와 세로에 한 번씩 쓰자.

입력
-1,000 ≤ x1, y1, x2, y2 ≤ 1,000, x1 ≠ x2, y1 ≠ y2, 1 ≤ n ≤ 100, -1,000 ≤ x, y ≤ 1,000 (모두 정수)
출력
n줄, 줄마다 "예" 또는 "아니요"
예시 1 · stdin
8 1 2 5
5
2 5
5 3
9 3
5 0
0 9
stdout
예
예
아니요
아니요
아니요
main.py
입력(stdin)

실행하면 이 줄들이 차례로 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]))    {        콘솔.쓰기("예");    }    아니면    {        콘솔.쓰기("아니요");    }}