슈뢰딩거의 고등어

[백준] 1105 팔 본문

알고리즘

[백준] 1105 팔

슈뢰딩거의 고등어 2022. 2. 25. 15:56

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

 

1105번: 팔

첫째 줄에 L과 R이 주어진다. L은 2,000,000,000보다 작거나 같은 자연수이고, R은 L보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

초기에 L 부터 R까지 하나씩 올려가면서 확인을 하려고 구현을 했더니 시간초과가 걸렸다. 다양한 방식으로 수정을 해봤지만 시간초과...

결국 질문을 확인했고, 거기에 나온 로직때로 구현했더니 성공

 

[로직]

1. L 과 R의 자리수가 같은지 판별

1-1. 다르다면 답은 0

1-2. 같다면 2.

 

2. L 과 R 의 각 자리수를 큰 자리수부터 비교한다.

2-1. 같다면 answer++;

2-2. 다르다면 break;

 

왜 그런지 확인해보자.

1-1 의 경우)

88, 888 은 자리수가 각각 2, 3이다. 

88 ~ 888 중에는 자리수가 바뀜으로 8이 존재하지 않는 수가 당연히 존재한다 (ex. 677)

 

2 의 경우)

8889 8899

앞자리수부터 비교를 시작한다.

첫째자리수가 둘다 8 임으로 answer = 1이 된다.

두번째 자리수 또한 8 임으로 answer = 2가 된다. 

세번째 자리수가 각각 8, 9 로 다르다. 그러므로 break;

그런데, 왜 break를 하는가?

8889 8890 8891 ~ 8899 까지 생각해보면, 8890 으로 세번째 자리수가 9로 바뀔 수 있다.

고로, 그 아래 모든 자리수들이 8이 아닌 수가 배치될 수 있으므로 그 이상 비교할 필요가 없는 것이다. (ex. 8893)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

string L, R;

int main() {

	cin >> L >> R;

	if(L.size() != R.size()) {
		printf("0\n");
		return 0;
	}
	int answer = 0;
	for(int i=0; i<L.size(); i++) {

		if(L[i] == R[i] && R[i] == '8')
			answer++;
		else if(L[i] != R[i])
			break;
	}
	printf("%d\n", answer);
	return 0;
}

'알고리즘' 카테고리의 다른 글

[BOJ] 15829 Hashing (modulo)  (0) 2022.03.15
[백준] 9184 신나는 함수 실행  (0) 2022.03.02
[23290]마법사 상어와 복제  (0) 2022.02.21
[프로그래머스] 3진법 뒤집기  (0) 2022.02.08
[백준] 12865 평범한 배낭  (0) 2022.02.08
Comments