이진 목록(목록의 1과 0)과 또 다른 값 k가 있다고 가정합니다. 숫자의 각 값은 감옥의 상태를 나타내며 1은 점유된 감방을 나타내고 0은 빈 감방을 나타냅니다. 셀에 인접한 두 셀이 모두 채워져 있거나 둘 다 비어 있으면 매일 셀이 채워집니다. 그렇지 않으면 비어 있게 됩니다. 그래서 우리는 k일 후에 감옥의 상태를 찾아야 합니다.
따라서 입력이 nums =[1, 0, 1, 0, 0, 0, 0, 0] k =1과 같으면 출력은 [0, 1, 1, 0, 1, 1, 1, 0], 우리가 알 수 있듯이 첫 번째와 마지막 인덱스는 절대 2개의 이웃을 가질 수 없기 때문에 점유될 수 없습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- next_day_state() 함수를 정의합니다. 셀이 필요합니다.
- new_cells :=셀 사본
- new_cells[0] :=0, new_cells[7] :=0
- 1~6 범위의 j에 대해
- cell[j - 1]이 cells[j + 1]과 같으면
- new_cells[j] :=1
- 그렇지 않으면
- new_cells[j] :=0
- cell[j - 1]이 cells[j + 1]과 같으면
- new_cell 반환
- 기본 방법에서 다음을 수행합니다.
- 본 :=새 지도
- 플래그 :=거짓, 나는 :=0
- 내가
- ns :=next_day_state(cells)
- ns가 표시되지 않으면
- ns를 본 대로 표시
- 그렇지 않으면
- 플래그 :=참
- 루프에서 나오다
- 셀 :=ns
- 나는 :=나는 + 1
- N :=N 모드(본 항목 수)
- i :=0
- i
- ns :=next_day_state(cells)
- 나는 :=나는 + 1
- 셀 :=ns
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예시
import copy class Solution: def next_day_state(self, cells): new_cells = copy.copy(cells) new_cells[0] = 0 new_cells[7] = 0 for j in range(1, 7): if cells[j - 1] == cells[j + 1]: new_cells[j] = 1 else: new_cells[j] = 0 return new_cells def solve(self, cells, N): seen = dict() flag, i = False, 0 while i < N: ns = self.next_day_state(cells) if tuple(ns) not in seen: seen[tuple(ns)] = True else: flag = True break cells = ns i += 1 if flag: N = N % len(seen) i = 0 while i < N: ns = self.next_day_state(cells) i += 1 cells = ns return cells ob = Solution() nums = [1, 0, 1, 0, 0, 0, 0, 0] k = 1 print(ob.solve(nums, k))
입력
[4, 7, 2, 5], 6
출력
[0, 1, 1, 0, 1, 1, 1, 0]