[첫화면으로]Diary/오일러프로젝트300번문제2

마지막으로 [b]

/오일러프로젝트300번문제2

뭐가 문제였는지 깨달았습니다.

[제가 짠 코드]에서 256라인 쪽을 보면

        # 그런데 스트링의 뒷부분이 0으로 채워진 곳은 굳이 검사할 필요가 없다.
        # 예를 들어 001101110000000 패턴의 경우 마지막 PPPPPPP 는 어떻게 접히든 H-H의 갯수와 무관.
        # 따라서    00110111        패턴이라 생각하고 길이 8짜리 형태들과 비교하면 된다.

        my $t_length;       # 실제 검사할 길이 (마지막 "1"까지의 길이)
        if ( $str =~ /1(0*)$/ ) {
            $t_length = $length - length($1);
        }
라고 되어 있는데... 계산에 걸리는 시간을 줄이기 위해서 검사대상의 수를 줄이려는 방법 중의 하나였고, 실제로 꽤 시간절약을 할 수 있었습니다만...

이게 샘플로 주어진 길이 8까지는 적용할 수 있는데 길이가 9 이상이 되는 순간 함정이 나오더군요.

101010010 를 접을 경우, 끝의 0을 빼고 생각한다면 다음과 같이 접힙니다.

 65         00
074        111
123        010
* H-H가 만나는 지점은 세 곳
그러나 실제로는 저렇게 접힐 수가 없죠;;; 7다음 8번 원소가 붙을 자리가 남지 않으니까... 실제로는 다음과 같이
 65         00
874        011
 03         10
 12         01
* H-H가 만나는 지점은 두 곳
최적으로 접혀도 두 곳밖에 생기지 않습니다.

트위터에서 [aer0님]이 자기가 푼 것과 제가 푼 결과가 길이9에서부터 달라지며, 자신이 푼 값이 더 작더라..는 정보를 주셔서... 길이9에서 패턴을 일일이 찍다보니까 눈에 들어왔습니다.

지금 생각하면 '왜 저런 착각을 했을까' 싶을 정도로 간단한 이유인데...;; 위와 같이 그 뒤에 원소가 추가로 붙을 자리가 남지 않는 경우가 길이9에서 처음 나타나고, 저는 계속 손으로 검증할 수 있는 길이 6정도에서만 그려보다보니까 눈치를 못 채고 있었네요. (샘플로 길이8의 값을 준 이유가 이걸 노린 것 같기도...?)

한시간 전에 이 오류를 깨닫는 순간 벌떡 일어나며 컵에 남은 음료수를 들이키다가, 태어나서 가장 심하게 사레가 들렸습니다. 익사할 때 심정을 조금은 느꼈는지도 -_-;;; 지금도 가슴이 얼얼하군요...

-- Raymundo 2010-9-15 1:48 am

Comments & Trackbacks

신난게 눈에 보여.. 새벽에 눈도 못뜬 상태에서 다 풀었다고 하면서, 의기양양했음.

-- Zehn02 2010-9-15 8:54 am
이름:  
Homepage:
내용:
 


주인장분류

<<   /주차장싸이렌 (2010-09-18)[p]   | /오일러프로젝트300번문제2 (2010-09-15) |   /오일러프로젝트300번문제 (2010-09-10)[n]   >>

Diary

최근 글들

코멘트와 트랙백

옛 글들

  • /Archive - 월별로 한번에 보기
  • /List - 전체 포스트 목록

RSS

주요 페이지

이 홈페이지의 인터위키는 다음과 같습니다.
GyparkWiki  UTF-8
https://gypark.pe.kr/wiki/


마지막 편집일: 2012-2-11 12:25 am (변경사항 [d])
986 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기