일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- C언어
- 딥러닝공부
- 백준 알고리즘
- 머신러닝공부
- 자바
- 지도학습
- python강좌
- acmicpc.net
- 비지도학습
- c언어 오목
- 선형회귀
- unsupervised learning
- Gradient Descent
- 머신러닝 강좌
- 자바강좌
- Python강의
- 딥러닝
- JAVA강좌
- java
- 머신러닝 강의
- 인공지능
- feature scaling
- 경사하강법
- supervised learning
- 파이썬강의
- 효묘블로그
- 비용함수
- 자바시작하기
- 머신러닝
- 파이썬강좌
Archives
- Today
- Total
컴공과컴맹효묘의블로그
백준 알고리즘[1019] 책 페이지 본문
반응형
문제 및 참고 사이트
https://www.acmicpc.net/problem/1019
https://mygumi.tistory.com/180
https://www.slideshare.net/Baekjoon/baekjoon-online-judge-1019
풀이
처음 봤을 때 이 문제를 어떻게 풀어야할지 brute force 이외에는 전혀 생각나지 않았다.
이 문제를 쉽게 풀 수 있는 핵심은 문제를 작은 단위로 나누는 것이다.
핵심 아이디어는 각 자릿수를 따로 계산하자라는 것이다.
즉, 1의 자릿수, 10의 자릿수... 를 따로 따로 세서 합치는 아이디어가 이 문제를 최적화 할 수 있는 핵심이다.
정확한 문제 풀이 이해는 백준님의 자료를 참고하자.
코드
#include <iostream>
#include <math.h>
using namespace std;
int nCount[10] = { 0 };
void calc(int n, int w) {
while (n) {
nCount[n % 10] += pow(10, w);
n /= 10;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int page;
int start = 1;
cin >> page;
for (int i = 0;; i++) {
while(page % 10 != 9 && start <= page) {
calc(page, i);
page--;
}
while(start % 10 != 0 && start <= page) {
calc(start, i);
start++;
}
if (start > page) break;
for (int j = 0; j < 10; j++) {
nCount[j] += ((int)(page / 10) - (int)(start / 10) + 1) * (int)pow(10, i);
}
page /= 10;
start /= 10;
}
for(int i = 0; i < 10; i++) {
cout << nCount[i] << " ";
}
return 0;
}
처음엔 백준님의 자료를 보고 혼자 풀어보려고 했지만 위 블로그에 정말 깔끔한 풀이가 있어서 코드를 갈아엎고 블로그에 적혀있는 코드를 참고하여 알고리즘을 짰다. 코드를 짤때 너무 돌아간 것 같다. 깔끔한 코드를 짜려고 더 고민해야할 것 같다. 문제를 나누고, 따로 해결하고 합치기.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준[14728] 벼락치기 (1) | 2022.07.16 |
---|---|
백준[1406] 에디터 (0) | 2022.05.26 |
백준 알고리즘[9694] 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (0) | 2020.06.26 |
백준 알고리즘[2410] 2의 멱수의 합 C++ (0) | 2020.06.22 |
백준 알고리즘[16112]-5차 전직 (1) | 2020.06.21 |
Comments