๊ฐ์ํ๋ ์
https://www.acmicpc.net/problem/1038
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 512 MB | 9364 | 2348 | 1876 | 29.716% |
๋ฌธ์
์์ด ์๋ ์ ์ X์ ์๋ฆฟ์๊ฐ ๊ฐ์ฅ ํฐ ์๋ฆฟ์๋ถํฐ ์์ ์๋ฆฟ์๊น์ง ๊ฐ์ํ๋ค๋ฉด, ๊ทธ ์๋ฅผ ๊ฐ์ํ๋ ์๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, 321๊ณผ 950์ ๊ฐ์ํ๋ ์์ง๋ง, 322์ 958์ ์๋๋ค. N๋ฒ์งธ ๊ฐ์ํ๋ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. 0์ 0๋ฒ์งธ ๊ฐ์ํ๋ ์์ด๊ณ , 1์ 1๋ฒ์งธ ๊ฐ์ํ๋ ์์ด๋ค. ๋ง์ฝ N๋ฒ์งธ ๊ฐ์ํ๋ ์๊ฐ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ N๋ฒ์งธ ๊ฐ์ํ๋ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ๋ธ๋ฃจํธ ํฌ์ค
๋์ ๋ต
์๊ฐ์ ํ๋ฆ
-
์์ ํ์ (๋ฌด์ํ๊ฒ ๊ตฌํ)
์ฒ์์๋ ์ซ์๋ฅผ 1์ฉ ์ฆ๊ฐ์์ผ ํ๋ํ๋ ์กฐ๊ฑด๊ฒ์ฌ๋ฅผ ํ๋ฉด์ ํด๋น index๊น์ง ๊ฐ์ํ๋ ์๋ฅผ ๋ด๋ arr๋ฅผ ์ฑ์ฐ๋ฉฐ ๊ณ์ฐํด๋๊ฐ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ๋ ํ๊ณ ๊ฐ์ํ๋ ์๋ 9876543210 ์ดํ ๋์ค์ง ์๋๋ฐ, ์ด๋ณด๋ค ํฐ ์๊ฐ ์ฃผ์ด์ง๋ฉด ๊ณ์ฐ๋ง ์ค๋ํ๊ณ ๊ฒฐ๊ตญ์ -1 ๊ฐ์ ๋ฐํํด์ผํจ์ ๊นจ๋ฌ์๋ค.
-
์์ ํ์ (๋ฐ๋๋ก ์๊ฐ)
๊ทธ๋ ๋ค๋ฉด ๋ฐ๋๋ก ์๊ฐํด์ ์ซ์๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ํ๋์ฉ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ํ๋ ์๋ฅผ ํ๋์ฉ ์ฐพ์์ index์ ์ง์ด๋ฃ์ด๋ณด์. ๊ฐ์ํ๋ ์๋ ๋ ๋์ ์๋ฆฟ์์ ์ซ์๊ฐ ๋ฎ์ ์๋ฆฟ์์ ์ซ์๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์, ๊ทธ ํน์ฑ์ ์ด์ฉํ๋ฉด ์์ ๋ฒ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค. ์ฒ์ ๋ ์ฌ๋ฆฐ ์๊ฐ์ด i, j์์ ๋ชจ๋ ๊ฐ๋ฅํ ์๋ฅผ ๋์ ํด๋ณด๋ ๋ฐฉ๋ฒ์ด์๋ค๋ฉด, ์ด์ ๋ j๊ฐ i๋ณด๋ค ์์ ๋ฒ์ ๋ด์์ ๋์ ํด๋ณด๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ์๋ฆฟ์๊ฐ 2์๋ฆฌ ์ผ ๋๋ i์ j๋ง ๊ตฌํํ๋ฉด ๋์ง๋ง ๋ ์ปค์ง๋ฉด for๋ฌธ์ด ๋๋ฌด ์ค์ฒฉ๋๊ณ ์ด๋ ๋ฐ๋ณต ๊ณ์ฐ์ธ ๊ฑฐ ๊ฐ๋ค.
-
๋ฐ๋ณต ๊ณ์ฐ ์ค์ด๊ธฐ
2๋ฒ ๊ณ์ฐ๊ณผ ๋๊ฐ์ด ๊ตฌํํ์ผ๋ ๋ฌ๋ผ์ง ๊ฒ์ i์์ ๊ฐ์ํ๋ ์๋ฅผ ๊ณ์ฐํ ๋, j์ k์ ๊ด๊ณ๊น์ง ๊ณ ๋ คํ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค. (๊ณ์ฐ ์ for๋ฌธ์ด 2๋ฒ๋ง ํ์ํจ). ์๋ ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๋ฐฉ์์ด ๋์์๋ค.
์ฝ๋
#include <iostream>
#include <cmath>
using namespace std;
long long arr[10][100000] = {};
int N;
int idx = 0;
int digit = 0;
int tmp_index[10];
long long arrN() {
int idx = 1;
int n = N - 9;
while (idx <= 9&&n > tmp_index[idx]) {
n -= tmp_index[idx++];
}
if (idx > 9)
return -1;
return arr[idx][n-1];
}
long long saveDecline() {
do{
digit++;
tmp_index[digit] = 0;
for (int i = 1; i < 10; i++) { // 1~9
for (int j = 0; j < sizeof(arr[digit - 1])/sizeof(int); j++) { // ์ด์ ์๋ฆฌ์ ๋ฐฐ์ด ๋๋ฉด์
if (arr[digit - 1][j] / pow(10, digit-1) < i) {
arr[digit][tmp_index[digit]++] = i * pow(10, digit) + arr[digit - 1][j];
idx++;
}
else
break;
}
}
} while (idx < N && digit < 9);
return arrN();
}
int main() {
cin >> N;
for (int i = 0; i < 10; i++) {
arr[digit][i] = i;
}
if (N<10)
cout << arr[digit][N];
else {
cout<< saveDecline();
}
}
์ค๋ช
main()
์ฐ์ arr์ ํ ์๋ฆฌ ์ ๊ฐ์ํ๋ ์๋ฅผ ๋ฃ๋๋ค. N์ด 10๋ณด๋ค ์์ผ๋ฉด ๋ฐ๋ก ํด๋น ๊ฐ์ ์ถ๋ ฅํ๊ณ 10๋ณด๋ค ํฌ๋ฉด arr๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด saveDecline ํจ์์ ๋ค์ด๊ฐ๋ค.
saveDecline()
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด digit๋ฅผ ๋๋ ค๊ฐ๋ฉด์ ๊ฐ digit(์๋ฆฟ์)๋ง๋ค 1~9๊น์ง ๋๋ฉด์ ํ์ฌ ์๋ฆฟ์๋ณด๋ค ํ ์๋ฆฌ ๋ฎ์ ์๋ฆฌ์ ๊ฐ์ํ๋ ์๋ฅผ ์ํํ๋ค. ์ํํ๋ ์์ ๊ฐ์ฅ ๋์ ์๋ฆฌ ์๊ฐ ํ์ฌ ๋๋ index๋ณด๋ค ๋ฎ์ผ๋ฉด ๋ํด์ ์ซ์๋ก ๋ง๋ ๋ค. (3์๋ฆฌ ๊ฐ์ํ๋ ์๋ฅผ ๋ง๋ค ๋, index๊ฐ 2๋ฉด 2์๋ฆฌ ๊ฐ์ํ๋ ์ ์ค์ 10์ด ๊ฐ์ฅ ๋์ ์๋ฆฌ ์๊ฐ 1์ด๋ฏ๋ก 2์ ํฉ์ณ์ง ์ ์๋ค.)
1~9๊น์ง ๋ค ๋๋ฉด digit๋ฅผ 1๋๋ ค์ ๋ค์ ์๋ฆฟ์๋ฅผ ๊ณ์ฐํ๋ค. ์๋ฆฟ์๋ง๋ค ๋ช๊ฐ์ ๊ฐ์ํ๋ ์๊ฐ ์๋์ง ๋์ค ๊ณ์ฐ์ ์ํด ์ ์ฅํด๋๋ค. arr์ ์์๋ฅผ ์ฝ์ ํ ๋๋ง๋ค ์ ์ญ๋ณ์ index๋ฅผ 1์ฉ ๋๋ ค index๊ฐ N์ ๋์ด์๋ฉด ๊ทธ๋ง ๊ณ์ฐํ๋๋ก do-while๋ฌธ์ ์กฐ๊ฑด์ผ๋ก ์ค๋ค.
*์ฌ๊ธฐ์ do-while๋ฌธ์ ์กฐ๊ฑด์ digit>9
๊ฐ ์๋ ์ด์ ๋ 9876543210 ๋ผ๋ 10์๋ฆฌ ์ ์ดํ์ ๊ฐ์ํ๋ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ์์ผ๋ก arr๋ฅผ ์ฃผ์ด์ง N๊ฐ ์ด์์ผ๋ก ์ฑ์ฐ๊ณ ๋๋ฉด ์ถ๋ ฅํ ์๋ฅผ ๊ณ์ฐํ๋ arrN ํจ์์ ๋ค์ด๊ฐ๋ค.
arrN()
arrN ํจ์์์๋ ์ฃผ์ด์ง N์์ ์๋ฆฟ์๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ์ด๋ค ์๋ฆฟ์์ ๋ช ๋ฒ์งธ ์นธ์ (arr์ ๋ช ํ ๋ช ์ด์) ์๊ฐ ์ ์ฅ๋์ด์๋์ง ๊ณ์ฐํ๋ค. ๋ง์ฝ ์์ ์ ๊ฐ์ด 18๋ฒ์งธ ์๋ฅผ ์ฐพ๋๋ค๋ฉด ํ ์๋ฆฌ์์ ๊ฐฏ์์ธ 10๋ณด๋ค๋ ํฌ๋ฏ๋ก mainํจ์์์ ํต๊ณผ๋์ด ๋ค์ด์์ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ N์์ 9์ ๋นผ๊ณ 9์ด ๋จ๋๋ค. ์๋ฆฟ์๋ 1์ฆ๊ฐํ๋ฉฐ ๋ ์๋ฆฌ์ ๊ฐ์ํ๋ ์์ ๊ฐฏ์๋ฅผ ๋ณด๋๋ฐ, 45๊ฐ ์ด๋ฏ๋ก 8๋ณด๋ค ์์ผ๋ ํด๋น ํ์ N๋ฒ์งธ์ ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ์๊ฐ ์์ ๊ฒ์ด๋ค. (arr[1][7]
)
*N์์ 10์ ๋นผ์ง ์๊ณ 9์ ๋นผ๋ ์ด์ ๋ ํ ์๋ฆฌ ์์ ์์ ๋ก ์๊ฐํด๋ณด์. 5๋ฒ์งธ ์๋ฅผ ์ฐพ์ผ๋ ค๋ฉด arr์ ํ ์๋ฆฌ์ ํ์ ์๋ 6๋ฒ์งธ ๊ฐ์ ๊ฐ์ ธ์์ผํ๋ค. ๋ฐ๋ผ์ N๋ฒ์งธ ์๊ฐ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ 9๋ฅผ ๋นผ์ฃผ์ด์ผํ๋ค.
*๋ฐฐ์ด์ index๊ฐ ํท๊ฐ๋ฆฌ๊ฒ ๋์ด์๋ค. ํด๋น ํ์ N๋ฒ์งธ์ ์กด์ฌํ๋ฏ๋ก arr[ํด๋น ํ][N-1]
์ returnํด์ผํ๋ค.
๊ฒฐ๊ณผ
arr๋ ๋ค์๊ณผ ๊ฐ์ด ์ฑ์์ง๋ค. ๋ง์ง๋ง 10์๋ฆฌ ์ ๊ฐ์ํ๋ ์๋ 9876543210 ํ๋์ด๊ณ ๊ทธ ์ดํ๋ ์กด์ฌํ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌํํด๋ณธ ๊ฒฐ๊ณผ 1022๋ฒ์งธ ์๊ฐ 9876543210์ด๊ณ 1023๋ถํฐ๋ -1์ด ๋์์ผํ๋ค.
๋ค๋ฅธ ๋ต
BaaaaaakingDog ๋์ ํ์ด๋ ๋จผ์ ์งํฉ์ ํน์ฑ์ ์ด์ฉํด์ ๊ฐ์ํ๋ ์์ ๊ฐฏ์๊ฐ ์ต๋ 1023๊ฐ๋ฐ์ ์์์ ์์๋ด๊ณ , 1023๊ฐ์ ์๋ฅผ ๊ตฌํ ํ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค.
=> ๋นํธ ๋ง์คํฌ๋ฅผ ์ด์ฉํ์๋ค. (๋๋ฌด ๋๋จํ์ฌ.. ํํ)
https://postbarca.tistory.com/46
ํ๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ์๋ค. ๋ฉ์๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1149๋ฒ :: RGB๊ฑฐ๋ฆฌ (0) | 2020.04.16 |
---|---|
[c++] BOJ 1417๋ฒ :: ๊ตญํ์์ ์ ๊ฑฐ (0) | 2020.04.10 |
[c++] BOJ 15961๋ฒ :: ํ์ ์ด๋ฐฅ (0) | 2020.04.02 |
[c++] ๋ฐฑ์ค 18809๋ฒ : Gaaaaaaaaaarden (0) | 2020.03.26 |
[c++] ๋ฐฑ์ค 18808๋ฒ : ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2020.03.21 |
Comment