CodeIQ가 망가진 파스카의 삼각형

7255 단어 codeiqPython

망가진 파스카 삼각형


2월 21일(수요일) AM10:00의 마감일이 지났기 때문에 투고합니다.
코드IQ가 있어서이런 문제 살짝 해봤어요.

문제.

パスカルの三角形を作るとき、隣り合った数の和を下段に追加していきますが、一か所だけ差を計算してしまっています。
次の図では、4段目・左から3つ目の値が、2 - 1 = 1になっているので、そこから下の部分の数が通常のパスカルの三角形と異なっています。
このような、壊れてしまったパスカルの三角形の一番下の段が入力として与えられたとき、
“何段目の”、“左から何番目”の値を求める際に差を計算してしまったのかを特定するプログラムを書いてください。
※「差」は、『大きい方の値から小さい方の値を引く』と考えてください。

【入力・出力】
入力データは1行目にパスカルの三角形の段数k、
2行目にk個の整数値が半角スペース区切りで与えられます。
kは最大60です。
k個の整数値は、壊れたパスカルの三角形のk段目を表しています。

これらの値を読み込み、間違えた計算方法で計算してしまった部分(差を計算した部分)を特定し、
その段数と左から数えて何番目に当たるかを半角スペース区切りで出力してください。

파스카의 삼각형은?



파스카의 삼각형은 위 옆에 있는 두 개의 숫자와 아래에 쓸 수 있는 삼각형을 가리킨다.

답안


아무튼 python3으로 써봤어요.

코드


codeiq_pascal.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def pascal(n):
    row = [1]
    for _ in range(1,n):
        row = list(map(lambda x, y: x+y, [0]+row, row+[0]))
    return row


def check(a,b):
    count = 0
    pos=0
    i=0

    for s,t in zip(a,b):
        i+=1
        if s != t:
            count += 1
        if count == 1:
            pos = i
    return count, pos

def main():
    k = int(input())
    while not 0 < k <= 60:
        print("k : invalid")
        k = int(input())

    numbers = list(map(int, input().split()))
    while len(numbers) != k:
        print("number : invalid")
        numbers = list(map(int, input().split()))

    pas = pascal(k)

    print("%s %s" % check(pas,numbers))

if __name__ == '__main__':
    main()

해설


파스카의 삼각형 중 하나는 잘못된 것이 있는데, 이를 정점으로 잘못된 삼각형 (녹색 테두리) 을 형성한 데 착안했다.
자세히 보면 맨 아래(입력 값)의 왼쪽에서 처음으로 잘못된 위치와 정점의 잘못된 위치의 관계(푸른 화살표)가 있는 것 같다.
교점까지의 레이어 수(노란색 화살표)는
(頂点までの段数) = (最下段の誤った数字の個数)
이걸로 표현할 수 있을 것 같아요.

우선 입력을 가져오는 처리입니다.발리를 잘 써서 좀 더러워요.pascal()는 파스카의 삼각형을 매개 변수 값의 단수까지 목록 형식으로 되돌려 주는 방법이다.check()는 매개 변수의 두 목록을 비교하여 왼쪽에서 다른 숫자의 개수를 세고 첫 번째 잘못된 위치를 되돌리는 방법이다.
이런 방법으로 최하층의 물건과 정확한 파스카의 삼각형이 무엇이 다른지 조사하면 잘못된 정점의 위치를 알 수 있다.
그리고 표준 출력에만 표시됩니다.
입력
7
1 6 13 14 9 4 1
출력
4 3

감상


이런 수수께끼 형식의 문제를 풀면 매우 재미있다.이것은 매우 좋은 두뇌 체조다.
고속화를 목표로 예쁘게 써야 한다는 것을 깨닫고 개선할 여지가 있다는 것을 깨닫는 다른 방법도 있다고 생각한다.
이것은 자신의 인코딩 능력을 재검토할 수 있는 좋은 기회다.

2/23 추기


지적하신 코드를 수정했습니다.

좋은 웹페이지 즐겨찾기