게시판에 게시물이 n개 있고, 한 쪽에 k개씩 보여 준다.
첫 줄에 n, k, p가 빈칸 하나씩 띄워 주어진다.
둘째 줄에 게시물 번호 n개가 화면에 보이는 차례대로 빈칸 하나씩 띄워 주어진다.
1쪽에는 첫째 게시물부터 k개가 나오고, 2쪽에는 그다음 k개가 나오며, 뒤쪽도 같은 식으로 이어진다.
마지막 쪽에는 남은 게시물만 나오므로 k개보다 적을 수 있다.
p쪽에 나오는 게시물 번호를 주어진 차례대로 빈칸 하나씩 띄워 한 줄에 출력하라.
입력
1 ≤ n ≤ 1,000, 1 ≤ k ≤ 1,000, 1 ≤ 게시물 번호 ≤ 1,000,000(정수). p는 1 이상이고, p쪽에는 게시물이 적어도 하나 있다(1 ≤ p이고 (p - 1) × k < n)
출력
p쪽의 게시물 번호를 한 줄에. 쉼표 없이 숫자만 쓴다
예시 1 · stdin
7 3 2
70 60 50 40 30 20 10
stdout
40 30 20
예시 2 · stdin
7 3 3
70 60 50 40 30 20 10
stdout
10
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
p쪽의 첫 게시물은 0부터 세어 start = (p - 1) * k번 자리에 있어요. 거기서부터 k개를 잘라 내는데, 자르기의 둘째 값이 '끝 자리'인 언어와 '개수'인 언어가 있어요. 끝 자리(그 자리는 넣지 않음): Python posts[start:start + k], JS·TS posts.slice(start, start + k), Java posts.subList(start, end), C++ std::vector<int>(posts.begin() + start, posts.begin() + end). 개수: C# posts.GetRange(start, count), 크레이콘 posts.부분목록(start, count). C에는 자르기가 없어서 start부터 end 앞까지 반복문으로 돌아요. 마지막 쪽처럼 끝이 목록 밖으로 나갈 때가 가장 달라요. Python과 JS·TS는 있는 데까지만 조용히 잘라 줘요. Java subList는 IndexOutOfBoundsException, C# GetRange는 ArgumentException으로 멈추고, 크레이콘 부분목록도 "자르는 자리가 목록 밖이에요"라며 멈춰요. C와 C++은 검사하지 않고 목록 밖의 값을 읽어요. 그래서 이 언어들은 end = min(start + k, n)이나 count = min(k, n - start)로 먼저 막아요. 함정 셋: ① 쪽 번호는 1부터라서 p * k로 시작하면 한 쪽 뒤가 나와요. ② JS slice(start, k)처럼 끝 자리에 개수를 넣으면 2쪽부터는 start가 k 이상이라 늘 빈 목록이 나와요. ③ 끝 자리는 들어가지 않으니 start + k - 1로 쓰면 게시물 하나가 빠져요.
Pythonmain.py · 5 줄
n, k, p = map(int, input().split())posts = list(map(int, input().split()))start = (p - 1) * k # p쪽의 첫 게시물이 있는 자리(0부터)page = posts[start:start + k] # 끝이 목록 밖이어도 있는 데까지만 자른다print(*page)
JavaScriptmain.js · 6 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const [n, k, p] = lines[0].trim().split(/\s+/).map(Number);const posts = lines[1].trim().split(/\s+/).map(Number);const start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터)const page = posts.slice(start, start + k); // slice(시작, 끝) — 끝이 목록 밖이어도 있는 데까지만console.log(page.join(" "));
TypeScriptmain.ts · 7 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const [n, k, p]: number[] = lines[0].trim().split(/\s+/).map(Number);const posts: number[] = lines[1].trim().split(/\s+/).map(Number);const start: number = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터)const page: number[] = posts.slice(start, start + k); // slice(시작, 끝) — 끝이 목록 밖이어도 있는 데까지만console.log(page.join(" "));
JavaMain.java · 23 줄
import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), k = sc.nextInt(), p = sc.nextInt(); List<Integer> posts = new ArrayList<>(); for (int i = 0; i < n; i++) posts.add(sc.nextInt()); int start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터) int end = Math.min(start + k, n); // subList는 끝이 목록 밖이면 예외라서 n으로 막는다 List<Integer> page = posts.subList(start, end); StringBuilder out = new StringBuilder(); for (int x : page) { if (out.length() > 0) out.append(' '); out.append(x); } System.out.println(out); }}
C#Main.cs · 19 줄
using System;using System.Collections.Generic;class Program{ static void Main() { string[] head = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int n = int.Parse(head[0]), k = int.Parse(head[1]), p = int.Parse(head[2]); var posts = new List<int>(); foreach (string s in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)) posts.Add(int.Parse(s)); int start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터) int count = Math.Min(k, n - start); // GetRange(시작, 개수)는 목록 밖이면 예외라서 남은 수로 막는다 List<int> page = posts.GetRange(start, count); Console.WriteLine(string.Join(" ", page)); }}
C++main.cpp · 21 줄
#include <algorithm>#include <iostream>#include <vector>int main() { int n, k, p; std::cin >> n >> k >> p; std::vector<int> posts(n); for (int& x : posts) std::cin >> x; int start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터) int end = std::min(start + k, n); // 마지막 쪽은 남은 게시물까지만 // 반복자 두 개(시작, 끝)로 새 vector를 만든다 std::vector<int> page(posts.begin() + start, posts.begin() + end); for (std::size_t i = 0; i < page.size(); i++) { if (i > 0) std::cout << ' '; std::cout << page[i]; } std::cout << '\n';}
Cmain.c · 20 줄
#include <stdio.h>int main(void) { int n, k, p; static int posts[1000]; if (scanf("%d %d %d", &n, &k, &p) != 3) return 0; for (int i = 0; i < n; i++) { if (scanf("%d", &posts[i]) != 1) return 0; } int start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터) int end = start + k; // 끝 자리(이 자리는 넣지 않는다) if (end > n) end = n; // 마지막 쪽은 남은 게시물까지만 // C에는 자르기가 없어서 start부터 end 앞까지 직접 돈다 for (int i = start; i < end; i++) { if (i > start) putchar(' '); printf("%d", posts[i]); } putchar('\n'); return 0;}
Craykonmain.cray · 9 줄
head = 콘솔.수들읽기();n = head[0];k = head[1];p = head[2];posts = 콘솔.수들읽기();start = (p - 1) * k; // p쪽의 첫 게시물이 있는 자리(0부터)count = 수학.작은수(k, n - start); // 부분목록(시작, 개수)은 목록 밖이면 멈추니 남은 수로 막는다page = posts.부분목록(start, count);콘솔.쓰기(page);