Leetcode Java Magical String
업데이트:
문제
코드
class Solution {
public int magicalString(int n) {
int fast = 1;
int slow = 1;
int num = 1;
int[] nums = new int[n + 2];
while (fast <= n) {
nums[fast++] = num;
if (nums[slow++] == 2) {
nums[fast++] = num;
}
num = 3 - num;
}
int count = 0;
for (int idx = 1; idx <= n; idx++) {
if (nums[idx] == 1) {
count++;
}
}
return count;
}
}
결과
설명
- 1과 2로 이루어진 아래의 규칙에 의해 생성된 문자열 s의 n 번째 자리까지 존재하는 1의 개수를 구하는 문제이다.
- 문자열 s는 “1221121221221121122…” 형태로 이루어지며, 그룹화하면 “1 22 11 2 1 22 1 22 11 2 11 22 …“으로 표현이 된다.
- 각 그룹의 1 또는 2의 발생 순서는 “1 2 2 1 1 2 1 2 2 1 2 2 …“으로 볼 수 있다.
- 이는 각 숫자가 반전이 될 때 $num = 3 - num$로 뒤집어 줄 수 있다.
- 문제 풀이에 필요한 변수를 정의한다.
- fast와 slow는 문자열 s를 구성하기 위한 인덱스로, 1로 초기화한다.
- fast는 현재 커서의 인덱스로 nums 내 값을 넣기 위한 변수이다.
- slow는 검증을 위한 인덱스로 nums 의 slow번째 값이 2인 경우, fast의 다음 자리에 num을 한 번 더 넣어주는 역할을 수행하여 위의 규칙을 만족하는 문자열 s를 만들 수 있다.
- num은 문자열 s의 각 위치에 들어갈 숫자로, 첫 값인 1로 초기화한다.
- nums는 문자열 s를 구성하기 위한 배열로, $n + 2$ 크기로 초기화한다.
- fast와 slow는 문자열 s를 구성하기 위한 인덱스로, 1로 초기화한다.
- fast가 n 이하일 때 까지 아래를 수행하여 문자열 s의 각 자리 숫자를 nums에 차례대로 넣어준다.
- nums의 fast번째 자리에 num을 넣고 fast를 증가시킨다.
- nums의 slow번째 값이 2인지 검증하고 slow를 증가시키고, 2가 맞는 경우 nums의 fast번째 값에 num을 넣어주고 fast를 증가시킨다.
- num에 $3 - num$을 넣어 숫자를 뒤집어준다.
- count를 0으로 초기화 시키고, nums를 반복하여 1의 개수를 count에 넣어 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기