순간을 성실히, 화려함보단 꾸준함을

[boj : 12755] 수면 장애 본문

알고리즘,SQL/백준,BOJ

[boj : 12755] 수면 장애

폭발토끼 2020. 8. 12. 17:30

 

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

 

12755번: 수면 장애

수면 장애를 가진 강민이는 잠이 오지 않아 적잖은 고통을 느끼고 있다. 강민이는 잠이 오지 않을 때마다 속으로 양을 세고 있었는데, 오늘따라 백만 마리까지 세었는데도 잠이 오지 않았다. 한

www.acmicpc.net

개인적으로 너무 힘들게 풀었던 문제입니다.

이걸 대체 어떻게 푸나,,,,싶었는데 풀었네요.

 

1. 입력된 input(=n) 값을 가지고 증가하는 수의 자릿수를 매번 빼준다면 결국에는 1억번의 연산 밑이 될거라는 생각으로 문제를 접근하였습니다.

2. 수를 1씩 증가시켜 주면서 이 수가 몇자리수(ret) 인지 계산을 해줍니다.

3. n 값에서 ret 값을 매번 빼줍니다.

4. n 이 0이 거나 0보다 작아지면 루프문을 빠져나옵니다.

5. n<=0 인걸 가지고 해당되는 값을 도출해 냅니다.

===>

ex) 만약 15번째 숫자를 알고 싶다면, n은 결국 0 이 됩니다. (12345678910111213)

이 '0'이 의미하는 바는 마지막을 빼준 값(cnt)에서 가장 낮은 자릿수에서 '|0|+1'번째 숫자라는 뜻입니다. (즉,맨 오른쪽 숫자부터 시작해서 0번 왼쪽으로 점프 한 값이라는 뜻)

다른 예제로 16이라면 n은 -1 이 되죠.(1234567891011213)

그럼 가장 낮은 자릿수에서 |-1| + 1 번째 숫자가 해당됩니다.(맨 오른쪽 숫자부터 시작해서 1번 왼쪽으로 점프한 값)

 

설명을 개떡같이 한 것 같은데 잘 이해가 안가시면 댓글로 남겨주세염

 

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int input,n,cnt=0;
	cin >> input;
	n = input;

	int t;
	while (n > 0) {
		int ret = 0;
		cnt++;
		t = cnt;
		while (t > 0)
			ret++, t /= 10;
		n -= ret;
	}
	int x = abs(n),ans;
	for (int i = 0; i <= x; i++)
		ans=cnt%10,cnt /= 10;
	cout << ans;
	return 0;
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[boj : 2651]자동차경주대회  (0) 2020.11.17
[boj : 2020] 부분 염기서열  (2) 2020.11.05
[boj : 8012]한동이는 영업사원!  (0) 2019.07.20
[ boj : 1939]중량제한  (0) 2019.07.07
[boj : 16434] 드래곤 앤 던전  (0) 2019.07.02