[백준] 1019번: 책 페이지 C++로 풀어보기

2023. 8. 12. 17:06·Algorithm/Baekjoon(C++)

https://www.acmicpc.net/problem/1019

 

1019번: 책 페이지

첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다.

www.acmicpc.net

 

1019번 설명

생각

페이지를 단순히 읽어나가면서 계산하면 당연히 시간초과가 발생한다.

 

하지만 아무리 생각해도 내 실력으로는 해결할 수가 없었다. 따라서 밑의 블로그 내용을 참고했다.

(그림도 그려가면서 상세히 설명해주셔서 더욱 이해하기에 편리했다.)

https://restudycafe.tistory.com/489

 

[백준/BOJ] 1019번 : 책 페이지 (수학, Counting) (+ Class 6 획득)

이 포스트에서는 프로그래밍 문제 사이트 백준 Online Judge(BOJ)의 1019번 : '책 페이지' 문제의 풀이 코드와 해설을 다루고 있습니다. 문제 난이도는 Solved.ac 기준 Gold I에 해당하며, 문제를 풀이하기

restudycafe.tistory.com

 

메인 아이디어는 일의 자리부터 시작해서

현재 자리의 수보다 작은 수들은 (n / 10 + 1) * (현재 자리 수),

현재 자리의 수는 add라는 변수를 사용하여 따로 계산,

현재 자리의 수보다 큰 수들은 (n / 10) * (현재 자리 수)로 계산한다는 것이다.

 

코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll arr[10];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int n;
	int add = 0; // 현재 자릿수에 해당하는 숫자를 계산하기 위해 만든 변수
	cin >> n;

	for (int i = 1; n != 0; i *= 10) {
		int now = n % 10; // n을 10으로 나눈 나머지
		n /= 10; // n을 10으로 나누어준다.

		arr[0] = arr[0] - i; // 처음에 계산할 때 0은 포함되지 않으므로 빼준다.
		// ex) 처음에 수가 0,1,2,3,4,5,6,7.... 이 때 0은 빼줘야 되니까


		// 현재 자릿수에 해당하는 숫자보다 작은 수들
		// 일의 자리를 계산한다고 가정해보자.
		// 만약 숫자가 123이라면 0,1,2는 120, 121, 122로 다른 숫자들보다 한 번 더 세어줘야한다.
		for (int j = 0; j < now; j++) { 
			arr[j] += (n + 1) * i;
		}

		// 현재 자릿수에 해당하는 숫자
		// 십의 자리를 계산한다고 가정해보자.
		// 만약 숫자가 123이라면 2는 120, 121, 122, 123 총 4번 나오므로
		// 다른 숫자와는 다르게 계산해줘야 함을 알 수 있다.
		arr[now] += n * i + 1 + add;

		// 현재 자릿수에 해당하는 숫자보다 큰 수들
		for (int j = now + 1; j <= 9; j++) {
			arr[j] += n * i;
		}

		add += now * i;
	}

	for (int i = 0; i < 10; i++) { // 출력
		cout << arr[i] << " ";
	}
}

n = 123이라고 해보자

1. 일의 자리
now는 3이고 n은 12가 된다.

arr[0]은 1이 빼진다.

arr[0] = (12+1) * 1;
arr[1] = (12+1) * 1;
arr[2] = (12+1) * 1;

arr[3] = 12 * 1 + 1 + 0(add);

arr[4] = 12 * 1;
arr[5] = 12 * 1;
..
arr[9] = 12 * 1;

add = add + 3 * 1;

2. 십의 자리
now는 2이고 n은 1이 된다.

arr[0]은 10이 빠진다.

arr[0] = (1 + 1) * 10;
arr[1] = (1 + 1) * 10;

arr[2] = 1 * 10 + 1 + 3 = 14

arr[3] = 1 * 10
arr[4] = 1 * 10
...
arr[9] = 1 * 10

add = add + 2 * 10

3. 백의 자리
now는 1이고 n은 0이 된다.

 

arr[0]은 100이 빠진다.

 

arr[0] = (0 + 1) * 100;

 

arr[1] = (0 * 100) + 1 + 20 = 21

 

그 뒤로는 n이 0이므로 계속 0이다.

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Baekjoon(C++)' 카테고리의 다른 글

[백준] 2230번: 수 고르기 C++로 풀어보기  (0) 2023.08.16
[백준] 2805번: 나무 자르기 C++로 풀어보기  (1) 2023.08.12
[백준] 1931번: 회의실 배정 C++로 풀어보기  (0) 2023.08.09
[백준] 1520번: 내리막 길 C++로 풀어보기  (0) 2023.08.06
[백준] 10814번: 나이순 정렬 C++로 풀어보기  (1) 2023.08.06
'Algorithm/Baekjoon(C++)' 카테고리의 다른 글
  • [백준] 2230번: 수 고르기 C++로 풀어보기
  • [백준] 2805번: 나무 자르기 C++로 풀어보기
  • [백준] 1931번: 회의실 배정 C++로 풀어보기
  • [백준] 1520번: 내리막 길 C++로 풀어보기
퀵차분
퀵차분
Web Developer 🥐
  • 퀵차분
    QC's Devlog
    퀵차분
  • 전체
    오늘
    어제
    • 분류 전체보기 (172) N
      • Frontend (28)
        • HTML, CSS (7)
        • Javascript (3)
        • React (11)
        • Typescript (2)
        • Next.js (4)
      • Node.js (3)
      • Fedify (4)
      • Study (42) N
        • NestJS (2) N
        • Modern JS Deep Dive (13)
        • SQL (1)
        • Network (1)
        • 프롬프트 엔지니어링 (4)
        • 인공지능 (9)
        • 시스템프로그래밍 (11)
        • 선형대수학 (1)
      • Intern (4)
      • KUIT (21)
      • Algorithm (48)
        • Baekjoon(C++) (26)
        • Programmers(JavaScript) (22)
      • 우아한테크코스(프리코스) (4)
      • Project (7)
        • PROlog (4)
        • Nomadcoder (2)
      • 생각 (4)
      • Event (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    타입스크립트
    음악추천
    프로그래머스 자바스크립트
    티스토리챌린지
    fedify
    오블완
    next.js
    HTML
    인공지능
    프로그래머스
    백준
    프론트엔드
    typescript
    react
    리액트
    알고리즘
    javascript
    시스템프로그래밍
    KUIT
    자바스크립트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
퀵차분
[백준] 1019번: 책 페이지 C++로 풀어보기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.