Monaca: 스도쿠 규칙 검사 에서 트랙백.
여기서는 규칙을 조금 단순하게 해서 한 열에 1~9까지 숫자가 빠짐없이 들어 있는지 검사하는 코드를 작성한다고 가정하자.
입력 값이 규칙에 맞으면 True, 틀리면 False를 출력한다.
입력
123456789
112345678
223456788출력
True
False
False
…
이와 비슷한 문제가 Programming Pearls(생각하는 프로그래밍)에도 있다. 거기서는 두 문자열을 받고, 그 중 하나가 다른 하나의 anagram(문자 순서를 재배치하는 것)인지 판단하는 문제다.
답은 간단히 : 정렬 & 비교.
쉽게쉽게 파이썬으로 짜보면, ((여기서 “”.join( 문자열-배열 ) 은 “” 안에 있는 문자열을 seperator로 문자열-배열을 합친다(concat; merge). 그리고 sorted(x)는 x가 iterable 한 무언가일 때, 그것의 정렬된 순서로 iterate하게 해준다. join 에 넣어버렸으니 정렬된 상태로 나와서 “” 기준으로 합쳤으니, 원래 문자열을 각 문자 단위로 정렬한게 된다))
def is_valid( x ): return “”.join(sorted(x)) == “123456789”
print is_valid(“123456789”)
print is_valid(“112345678”)
print is_valid(“223456788”)
…
실행결과는,
True
False
False
…
중복여부를 파악하는 방법은 정렬시켜버리고, 이를 비교하는게 제일 만만하다. (*nix 에서는 sort | uniq 구문을 자주 보게된다) 두 개를 비교하는 경우에도 일종의 merge 연산 비슷한게 되서 쉬운편(…)
+ 냅 그렇지만 직업 프로그래머가 이런 퀴즈를 푸는건 조금 반칙인지도 모르니 댓글이 아니라 트랙백으로(…)
+ WP가 ‘ 2개를 붙여 쓰면 좀 예쁘지 않게 출력하는군요. 그냥 “로 바꿈.
“중복여부를 파악하는 방법은 정렬시켜버리고, 이를 비교하는게 제일 만만하다. (*nix 에서는 sort | uniq 구문을 자주 보게된다)”
의외로 이걸 안 떠올리면 참 쓸데도 없는 고생을 하게 되지 orz (해 본 사람만이 알지.)
근데 하다보면 익숙해져서 떠올리게 되지 않나요(?)
스도쿠 규칙 검사의 하스켈 구현…
원문은 Monaca: 스도쿠 규칙 검사 에서 가져왔습니다. 저는 한단계 건너서 rein 님의 Quiz: 스도쿠 규칙 검사 를 보고 알게 되었습니다.
스도쿠는 1~9까지 숫자가 겹치지 않게 채워 넣는 게임이다.
….