당신은 다른 두 명의 가장 친한 친구와 함께 사는 젊은 프로그래밍 괴짜입니다. 매주, 당신 중 한 명이 집안의 모든 집안일을해야하고 당신은 막대기를 골라서 자신의 차례를 결정합니다. 가장 짧은 스틱을 고르는 사람은 모든 집안일을 잃어 버립니다.
여러분 모두 프로그래머이며 퍼즐 만들기를 좋아하므로 "가장 짧은 스틱 선택"을 컴퓨터 퍼즐로 수정했습니다.
퍼즐의 규칙은 다음과 같습니다.
- 각 열은 스틱을 나타내는 2D 행렬이 제공됩니다.
- 각 열에서 1은 스틱의 일부를 나타내고 0은 빈 공간입니다.
- 각 열의 상단에서 하단으로 갈 때 처음에는의 열이 있고을
0
누르 자마자1
스틱이 시작되고 열의 나머지 부분1
만 채워집니다. - 하나의 열을 선택하도록 프로그램을 작성할 수 있습니다. 해당 열의 스틱 크기에 따라 승자 / 패자가 결정됩니다. 스틱의 크기 == 해당 열에있는 1의 수
- 그러나 해당 프로그램은 최악의 선형적인 시간 만 가질 수 있습니다.
여러분은 모두 프로그래머이므로 다른 사람의 프로그램이 시간 복잡도 제한을 맞추고 있는지 알 수 있습니다.
당신의 임무는 :
- 2D 형식 또는 문자열 배열로 입력을받는 프로그램이나 함수를 작성하십시오.
- STDIN / 프롬프트 / 콘솔 또는 함수 인수에서 입력을 가져올 수 있습니다.
- STDIN / 프롬프트에서 입력을 읽는 경우 입력을 읽고 배열로 변환하는 데 0 시간이 걸리는 것으로 가정 할 수 있습니다 (그렇지만 코드가 응답에 있어야 함)
- 가장 긴 스틱이있는 컬럼을 결정하십시오.
- 출력은 함수의 반환 값 또는 STDOUT / 콘솔 / 경고 일 수 있습니다.
- 프로그램 / 기능 최악 시간 복잡도 선형 있어야 행수이고 열의 수있다.
O(m+n)
m
n
입력은 다음 형식 중 하나 일 수 있습니다.
2D 어레이 :
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
문자열 배열 :
[ "0000", "1000", "1101", "1111" ]
입력에는 다음과 같은 속성이 있습니다.
- 배열의 크기를 알 수 없음, 모든 크기의 사각형을 가정
- 어떤 열에서든 아래로 내려 오면 1이 표시되면 아래의 모든 것이 1이됩니다
- 빈 열 (0 길이) 스틱 이 허용됩니다.
이것은 코드 골프이므로 가장 짧은 코드가 승리합니다 ! *
코드를 설명하거나 예상치 못한 두 가지 입력 형식 중 어떤 것과 함께 골프화되지 않은 버전 (시간 복잡성을 확인하기 위해)을 제공하십시오.
업데이트 선형 시간 복잡도는 여기서 n은 열 크기이고 m은 행 크기 인 O (n + m)을 의미합니다. (불분명 한 사람들을 위해)
업데이트 2 이것은 확실히 선형 시간으로 수행 할 수 있습니다. 그리고 답변을 게시하는 경우 공정한 싸움을 위해 며칠 씩 논리 / 알고리즘 게시를 지연시킬 수 있습니다. :)
업데이트 3 시간 복잡성과 프로그램을 확인하기 위해 몇 시간 안에 모든 답변을 살펴 보겠습니다. :)
1
입력 의 유일한 셀이 마지막 셀인 경우 전체 입력을 읽어야합니다. 언어의 표준 라이브러리가 stdin에 대한 임의 액세스를 위조하더라도 장면 아래에서 버퍼링하므로 시간은 Omega (n * m)입니다.