10부제 풀이: 끝자리 비교로 위반 차량 수 세기

··설명 약 4분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 준비와 기초 구현 · 문제

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

10부제 문제는 날짜의 일의 자리와 차량 번호를 받아 무엇을 세나요?

날짜의 일의 자리와 차량 번호를 입력받아 10부제를 위반한 차량 수를 구하는 문제입니다. 정수·나머지·배열의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.

적용 조건·범위: 공간을 나누어 보면 차량을 세는 반복은 기준 숫자와 개수만 유지해 O(1) 추가 상태를 사용하며, 출력 숫자 하나도 O(1)입니다. 다만 위 전체 코드는 입력 문자열·숫자 배열 input과 slice로 만든 cars를 저장하므로 차량 수 n에 대해 전체 저장 공간은 O(n)입니다. 원문처럼 7대로 고정된 입력에서는 이 저장량도 고정되어 있습니다.

공식 문서 참고: 관련 개념: MDN 나머지 연산과 십진 끝자리

문제

문제명: 10부제
제공 학습 자료의 출처 표기: 한국정보올림피아드
문제 설명:
서울시는 6월 1일부터 교통 혼잡을 막기 위해 자동차 10부제를 시행합니다. 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지합니다. 날짜의 일의 자리 숫자가 주어지고 7대의 자동차 번호의 끝 두 자리 수가 주어질 때, 10부제를 위반하는 자동차의 대수를 출력합니다.

입력 설명:
첫 줄에는 날짜의 일의 자리 숫자가 주어지고, 두 번째 줄에는 7대의 자동차 번호의 끝 두 자리 숫자가 주어집니다.

출력 설명:
주어진 날짜와 자동차의 일의 자리 숫자를 비교하여 10부제를 위반하는 차량의 대수를 출력합니다.

입력 예제 1:
3
25 23 11 47 53 17 33

출력 예제 1:
3

입력 예제 2:
0
12 20 54 30 87 91 30

출력 예제 2:
3

추가 제한 사항

없음
기준 끝자리와 각 차량의 끝자리를 비교해 일치한 항목만 세는 흐름

직접 풀어보기

먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.

0 / 6,000바이트

solution(target,cars)에 날짜 일의 자리와 7개 정수 배열을 전달하며 위반 수를 숫자로 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요. Tab은 다음 항목으로 이동합니다. 입력 영역 오른쪽 아래를 끌어 높이를 조절할 수 있습니다.

비밀키·개인정보는 입력하지 마세요. 코드는 이 페이지에만 유지됩니다.

해답·해설 보기
JavaScript 해답
function solution(target, cars) {
    let count = 0;
    for (const car of cars) if (car % 10 === target) count++;
    return count;
}

solution(target,cars)에 날짜 일의 자리와 7개 정수 배열을 전달하며 위반 수를 숫자로 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.

원자료와 확인 범위

2026-10-12에 제공된 학습 자료 섹션 1. 기본문제풀이.pdf의 7쪽 ‘10부제’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.

제공 PDF에는 한국정보올림피아드가 출처로 표시되어 있습니다. 이번 확인에서 KOI 공식 과거 대회 기록의 해당 옛 문제 원본을 확보하지 못했으므로 대회 연도·부문과 공식 채점 결과를 추가로 단정하지 않습니다.

이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.

이 문제는 각 차량 번호의 일의 자리가 날짜의 일의 자리와 같은지만 확인하면 됩니다. 차량 번호 끝 두 자리 수가 23이라면 비교할 값은 23 전체가 아니라 23 % 10으로 구한 3입니다.

풀이 방법

  1. 첫 번째 입력값을 기준 숫자 target으로 저장합니다.
  2. 차량 번호를 하나씩 순회합니다.
  3. car % 10 === target이면 정답을 1 증가시킵니다.
  4. 모든 차량을 확인한 뒤 정답을 출력합니다.

예제 1에서 기준은 3이고, 23, 53, 33의 일의 자리가 3이므로 정답은 3입니다. 기준이 0인 경우도 같은 방식으로 처리할 수 있어 별도의 예외 처리가 필요하지 않습니다.

각 값의 마지막 부분을 분리해 기준값과 비교하고 결과를 모으는 과정

아래 전체 코드는 표준 입력의 첫 숫자를 기준 끝자리, 나머지를 차량 번호로 읽습니다. Node.js용 solution.cjs와 input.txt를 같은 폴더에 저장하고, 입력 첫 줄은 3, 둘째 줄은 25 23 11 47 53 17 33으로 씁니다. 차량 수 7을 추가하지 않습니다. Bash·명령 프롬프트의 node solution.cjs < input.txt 또는 PowerShell의 cmd /c “node solution.cjs < input.txt”로 실행할 때 기대 출력은 3입니다. 기준을 0으로 바꾸어 본문의 두 번째 예제도 비교하세요.

const fs = require('fs');

const input = fs
  .readFileSync(0, 'utf8')
  .trim()
  .split(/\s+/)
  .map(Number);

const target = input[0];
const cars = input.slice(1);

let answer = 0;

for (const car of cars) {
  if (car % 10 === target) {
    answer += 1;
  }
}

console.log(answer);

/\s+/ 정규식은 공백과 줄바꿈이 섞인 입력을 공백 문자 기준으로 나눕니다. 이후 map(Number)로 숫자로 변환하고, 차량마다 % 10을 적용해 일의 자리만 비교합니다.

복잡도

차량 수를 n이라고 하면 각 차량을 한 번씩 확인하므로 시간 복잡도는 O(n)입니다. 문제에서는 차량이 7대로 고정되어 있지만, 배열 전체를 순회하는 형태로 작성하면 입력 개수가 달라져도 같은 코드 구조를 사용할 수 있습니다.

공간을 나누어 보면 차량을 세는 반복은 기준 숫자와 개수만 유지해 O(1) 추가 상태를 사용하며, 출력 숫자 하나도 O(1)입니다. 다만 위 전체 코드는 입력 문자열·숫자 배열 input과 slice로 만든 cars를 저장하므로 차량 수 n에 대해 전체 저장 공간은 O(n)입니다. 원문처럼 7대로 고정된 입력에서는 이 저장량도 고정되어 있습니다.

이 문제를 푼 뒤 확인하기

날짜 끝자리와 차량 번호 끝자리가 같은 경우만 세는지, 10의 배수를 포함해 확인해 보세요.

본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.

글 소개·학습 준비·전체 목차
먼저 직접 풀어보세요

차량 번호를 10으로 나눈 나머지가 주어진 날짜의 끝자리와 같은지 비교해 일치한 차량만 셉니다. 예제의 끝자리 3과 일치하는 차량은 23, 53, 33으로 총 3대입니다. 문제에 적힌 규칙을 아래 코드와 연결하세요.

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.

다음 추천 · 문제: 큰 수 출력하기 풀이

같은 주제의 문제에 적용하며 방금 배운 개념을 확인합니다.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 58개 · 필수 58개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기