{ }codelper
문자열 비교P0056

두 단어 사전 순 비교

첫 줄에 질문 수 q가 주어진다.
이어서 q줄에 걸쳐 영어 단어 두 개 a, b가 빈칸 하나로 띄어 주어진다.
질문마다 a가 b보다 앞이면 -1, 같으면 0, 뒤면 1을 한 줄에 출력하라.
앞뒤는 글자 코드(ASCII)로 정한다: 첫 글자부터 차례로 비교해 처음 다른 글자의 코드가 작은 쪽이 앞이다.
이 규칙에서는 대문자(A~Z, 65~90)가 모두 소문자(a~z, 97~122)보다 앞이라 "Zoo"가 "apple"보다 앞이다.
한 단어가 다른 단어의 앞부분과 같으면("app"과 "apple") 짧은 쪽이 앞이다.

입력
1 ≤ q ≤ 1,000.
단어는 영어 대문자·소문자, 길이 1 ~ 20
출력
q줄, 질문마다 -1, 0, 1 중 하나
예시 1 · stdin
4
apple banana
app apple
Zoo apple
same same
stdout
-1
-1
-1
0
main.py
입력(stdin)

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

$ 준비됐어요

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

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

문자열 크기 비교: Python·JS·TS·C++·크레이콘은 a < b를 바로 써요(모두 글자 코드 순).
Java a.compareTo(b), C strcmp(a, b), C++ a.compare(b), C# string.Compare(a, b, StringComparison.Ordinal)은 음수·0·양수를 돌려주는데, -1과 1이라는 약속은 없어요. Java compareTo는 처음 다른 글자의 코드 차이("a"와 "c"는 -2)나 길이 차이를 주고, C strcmp도 구현에 따라 글자 차이를 줘요.
그래서 Integer.signum·Math.Sign·(r > 0) - (r < 0)으로 부호만 남겨요.
Python에는 세 갈래 비교 함수가 없어서 (a > b) - (a < b)로 만들어요.
대소문자 함정: C# string.Compare(a, b)(StringComparison 없이)는 문화권 규칙이라 "a"가 "B"보다 앞이 되고, JS a.localeCompare(b)도 마찬가지예요.
글자 코드 순서를 원하면 C#은 Ordinal, JS는 <를 써요.

Pythonmain.py · 4 줄
q = int(input())for _ in range(q):    a, b = input().split()    print((a > b) - (a < b))
JavaScriptmain.js · 7 줄
const [q, ...lines] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out = [];for (let i = 0; i < Number(q); i++) {  const [a, b] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
TypeScriptmain.ts · 8 줄
import { readFileSync } from "node:fs";const [q, ...lines]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const out: number[] = [];for (let i = 0; i < Number(q); i++) {  const [a, b]: string[] = lines[i].split(" ");  out.push(a < b ? -1 : a > b ? 1 : 0);}console.log(out.join("\n"));
JavaMain.java · 16 줄
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int q = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < q; i++) {            String[] p = br.readLine().trim().split(" ");            // compareTo는 -1/1이 아니라 "차이"를 돌려주므로 부호만 남긴다            out.append(Integer.signum(p[0].compareTo(p[1]))).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 18 줄
using System;using System.Text; class Program{    static void Main()    {        int q = int.Parse(Console.ReadLine());        var out_ = new StringBuilder();        for (int i = 0; i < q; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            // 글자 코드로 비교하려면 Ordinal(기본 string.Compare는 문화권 규칙을 따른다)            out_.Append(Math.Sign(string.Compare(p[0], p[1], StringComparison.Ordinal))).Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 13 줄
#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    int q;    std::string a, b;    std::cin >> q;    for (int i = 0; i < q; i++) {        std::cin >> a >> b;        std::cout << (a < b ? -1 : a > b ? 1 : 0) << '\n';    }}
Cmain.c · 14 줄
#include <stdio.h>#include <string.h> int main(void) {    int q;    char a[32], b[32];    if (scanf("%d", &q) != 1) return 0;    for (int i = 0; i < q; i++) {        scanf("%31s %31s", a, b);        int r = strcmp(a, b);  /* 부호만 정해져 있다: 음수, 0, 양수 */        printf("%d\n", (r > 0) - (r < 0));    }    return 0;}
Craykonmain.cray · 19 줄
q = 콘솔.줄읽기().수로변환();반복 (i = 0; i < q; i++){    words = 콘솔.줄읽기().나누기();    a = words[0];    b = words[1];    만약 (a < b)    {        콘솔.쓰기(-1);    }    아니면 만약 (a > b)    {        콘솔.쓰기(1);    }    아니면    {        콘솔.쓰기(0);    }}