Quiz: 스도쿠 규칙 검사

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개를 붙여 쓰면 좀 예쁘지 않게 출력하는군요. 그냥 “로 바꿈.

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

3 Comments

  1. “중복여부를 파악하는 방법은 정렬시켜버리고, 이를 비교하는게 제일 만만하다. (*nix 에서는 sort | uniq 구문을 자주 보게된다)”

    의외로 이걸 안 떠올리면 참 쓸데도 없는 고생을 하게 되지 orz (해 본 사람만이 알지.)

  2. 스도쿠 규칙 검사의 하스켈 구현…

    원문은 Monaca: 스도쿠 규칙 검사 에서 가져왔습니다. 저는 한단계 건너서 rein 님의 Quiz: 스도쿠 규칙 검사 를 보고 알게 되었습니다.
    스도쿠는 1~9까지 숫자가 겹치지 않게 채워 넣는 게임이다.
    ….

Leave a Reply