{ }codelper
글자 번호문자 하나P0053

글자가 처음과 마지막으로 나오는 자리

첫 줄에 문자열 s, 둘째 줄에 글자 하나 c가 주어진다.
s에서 c가 처음 나오는 자리와 마지막으로 나오는 자리를 빈칸 하나로 띄워 출력하라.
자리는 0부터 센다.
c가 s에 한 번도 없으면 "-1 -1"을 출력한다.
한 번만 나오면 두 수가 같다.

입력
s는 영어 소문자와 숫자, 길이 1 ~ 1,000.
c는 영어 소문자나 숫자 한 글자
출력
처음 자리와 마지막 자리(없으면 -1 -1)
예시 1 · stdin
banana
a
stdout
1 5
예시 2 · stdin
hello
z
stdout
-1 -1
main.py
입력(stdin)

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

$ 준비됐어요

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

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

처음 자리·마지막 자리: Python s.find(c)/s.rfind(c), JS·TS·Java indexOf/lastIndexOf, C# IndexOf/LastIndexOf(char를 넘기면 서수 비교), C++ find/rfind, C strchr/strrchr.
크레이콘은 s.자리찾기(c)로 처음 자리를 얻고, 마지막 자리는 끝에서부터 s[i] == c를 묻는 반복으로 찾아요(뒤에서 찾는 멤버가 없어요).
없을 때 돌려주는 값이 언어마다 달라요: 대부분 -1이지만, Python index/rindex는 ValueError를 던지고, C++ find는 std::string::npos(size_t의 가장 큰 수, 18446744073709551615)를 줘서 그대로 출력하면 -1이 아니에요.
C의 strchr은 포인터나 NULL을 주니, NULL인지 먼저 묻고 p - s로 자리를 구해요.
글자 하나는 Java·C#·C·C++에서 char(작은따옴표 'a')이고, Python·JS·TS·크레이콘에는 따로 없어서 길이 1인 문자열이에요.

Pythonmain.py · 3 줄
s = input()c = input()[0]print(s.find(c), s.rfind(c))
JavaScriptmain.js · 3 줄
const [s, line] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.trim());const c = line[0];console.log(s.indexOf(c), s.lastIndexOf(c));
TypeScriptmain.ts · 4 줄
import { readFileSync } from "node:fs";const [s, line]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.trim());const c: string = line[0];console.log(s.indexOf(c), s.lastIndexOf(c));
JavaMain.java · 11 줄
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));        String s = br.readLine().trim();        char c = br.readLine().trim().charAt(0);        System.out.println(s.indexOf(c) + " " + s.lastIndexOf(c));    }}
C#Main.cs · 11 줄
using System; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        char c = Console.ReadLine().Trim()[0];        Console.WriteLine(s.IndexOf(c) + " " + s.LastIndexOf(c));    }}
C++main.cpp · 12 줄
#include <iostream>#include <string> int main() {    std::string s;    char c;    std::cin >> s >> c;    size_t first = s.find(c);    size_t last = s.rfind(c);    std::cout << (first == std::string::npos ? -1 : (long long)first) << " "              << (last == std::string::npos ? -1 : (long long)last) << "\n";}
Cmain.c · 12 줄
#include <stdio.h>#include <string.h> int main(void) {    char s[1001];    char c;    if (scanf("%1000s %c", s, &c) != 2) return 0;    char *first = strchr(s, c);    char *last = strrchr(s, c);    printf("%d %d\n", first ? (int)(first - s) : -1, last ? (int)(last - s) : -1);    return 0;}
Craykonmain.cray · 13 줄
s = 콘솔.줄읽기().공백제거();c = 콘솔.줄읽기().공백제거()[0];first = s.자리찾기(c);last = -1;반복 (i = s.길이 - 1; i >= 0; i--){    만약 (s[i] == c)    {        last = i;        그만;    }}콘솔.쓰기(first + " " + last);