배경
내가 영감을받은 3Blue1Brown 의 최근 영상 정보] 목걸이 분할 문제 (또는 그는, 훔친 목걸이 문제 전화로)과의 관계 보르 수크 - 울람 정리를 .
이 문제에서는 두 강도는 보석의 여러 가지 유형으로 구성된 소중한 목걸이를 훔쳤다. 이 보석의 각 유형의 짝수이며, 도둑은 두 사람 사이에 균등하게 각 보석 유형을 분리하고 싶습니다. 캐치은 연속 몇몇 개수의 세그먼트로 분할하여 그렇게 목걸이를하고 두 사람 사이의 세그먼트를 배포해야한다는 것입니다.
여기서 표시된 네 보석 유형의 예는 S
, E
, D
, 및 R
(각각 사파이어, 에메랄드, 다이아몬드, 루비 용). 목걸이가 다음과 같다고 가정 해 봅시다.
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
있다 8
사파이어, 10
에메랄드, 4
다이아몬드와 6
루비. 목걸이를 다음과 같이 나눌 수 있습니다.
[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
우리는 하나 개 도둑 다른 도둑에 제 2 및 제 4 세그먼트에 제 1, 제 3, 제 5 세그먼트를 제공한다면, 각각으로 끝날 4
사파이어, 5
에메랄드, 2
다이아몬드 및 3
루비로 .
[S], [S,E,S,D,E,R,S], [R,R,D,E,E,E]
[S], [R,E,S,S,S,D,R,E,E,R,E,D,E],
사용 0
-indexing를,이 상처는 인덱스에서 발생 [1,2,9,22]
.
골
그러한 공정 분할은 항상 보석 종류의 수 인 최대 n
컷을 사용하여 수행 할 수 n
있습니다. 당신의 임무는 목걸이를 입력으로 사용하고 최소한의 그러한 분할 (최소 컷 수)을 출력하는 완전한 프로그램이나 기능을 작성하는 것입니다.
입력
입력은 편리한 형식 일 수 있습니다. 목걸이는 일련의 보석이어야하며 그 이상은 아닙니다. 예를 들어 정수 목록, 보석 종류 및 값을 나타내는 키가있는 사전은 색인 목록입니다. 선택적으로 목걸이의 길이 또는 별개의 보석 유형 수를 포함 할 수 있지만 다른 입력은하지 마십시오.
입력 목걸이가 유효하다고 가정 할 수 있습니다. 거기에 지정된 유형의 보석의 홀수 또는 목걸이가 비어 어디 있는지 경우를 처리 할 필요가 없습니다.
산출
다시, 출력은 임의의 편리한 형식 일 수있다; 예를 들어, 세그먼트의 목록은, 절단 위치의리스트가 상기 두 강도를 나타내는 키와 세그먼트의 목록 인 값으로 사전이 등 세그먼트 보석 인덱스 연속 인덱스리스트 목록을 종료 선발 인덱스로 나타낼 수있다, 길이 등 . 0
또는 1
인덱싱을 사용할 수 있습니다 . 순서가 형식에 중요하지 않은 경우 출력 순서가 달라질 수 있습니다. 다음은 여러 가지 형식의 위 출력입니다.
list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
list of cuts: [1,2,9,22]
list of lengths: [1,1,7,13,6]
dictionary: {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]}
순서가 아니라 상처 또는 사전의 목록에서 세그먼트 목록 (세그먼트 도둑 교대)와 (세그먼트를 식별하기 위해) 길이의 목록에서 중요합니다. 편집 : 그렉 마틴 (Greg Martin)은 공정 분할을 두 번의 컷으로 얻을 수 있기 때문에 이것이 유효한 결과가 아니라고 지적했습니다.
테스트 사례
[1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]]
[1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]]
[1,1,1,1,1,1,1,1,1,1,1,1] -> [[1,1,1,1,1,1],[1,1,1,1,1,1]]
[1,1,1,1,2,3,4,2,3,4,2,2] -> [[1,1],[1,1,2,3,4,2],[3,4,2,2]]
노트
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
, [[S,S,S,E,S,D,E,R],[S,R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
그보다 더 적은 컷이 있기 때문에 출력이 있어야합니다 [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
. 나는 제대로 스펙을 이해하고 있습니까?