※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 18222번 문제인 투에-모스 문자열이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/18222
18222번: 투에-모스 문자열
0과 1로 이루어진 길이가 무한한 문자열 X가 있다. 이 문자열은 다음과 같은 과정으로 만들어진다. X는 맨 처음에 "0"으로 시작한다. X에서 0을 1로, 1을 0으로 뒤바꾼 문자열 X'을 만든다. X의 뒤에
www.acmicpc.net
투에-모스 수열(Thue-Morse sequence)은 음이 아닌 정수 n번째 항의 값이 n의 2진수 표현에 들어가는 1의 개수가 홀수이면 1, 짝수이면 0인 수열이다.
0부터 (2^n) - 1번째까지의 투에-모스 수열의 값을 알 때, (2^n)부터 2^(n+1) - 1번째까지의 투에-모스 수열의 값은 (문제에서의 설명과 같이) 1과 0이 뒤바뀐 형태로 나타내는데, 이는 이진수 표현에서 대응되는 숫자의 앞쪽에 새로운 1이 하나씩 추가되는 것으로 쉽게 발견해낼 수 있는 성질이다.
투에-모스 수열의 더 많은 성질을 알고 싶다면 위키백과를 참고하자:
https://en.wikipedia.org/wiki/Thue%E2%80%93Morse_sequence
이 문자에서는 문자열의 첫 숫자의 index를 1로 잡고 있으므로, 주어진 k에서 1을 뺀 값의 이진수 표현의 1의 개수를 세는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int ans = 0;
ll N; cin >> N; N--;
while (N > 0) {
if (N & 1) ans ^= 1;
N >>= 1;
}
cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ 12722 // C++] Mousetrap (Large) (0) | 2021.09.09 |
---|---|
[BOJ 8741 // C++] 이진수 합 (0) | 2021.09.08 |
[BOJ 12888 // C++] 완전 이진 트리 도로 네트워크 (0) | 2021.09.06 |
[BOJ 1707 // C++] 이분 그래프 (0) | 2021.09.05 |
[BOJ 4963 // C++] 섬의 개수 (0) | 2021.09.04 |