Zeckendorf 대표 아래 요약


14

Zeckendorf의 정리 는 모든 양의 정수가 인접하지 않은 피보나치 수의 합으로 고유하게 표현 될 수 있음을 보여줍니다. 이 문제에서는 Zeckendorf 표현에서 두 숫자의 합을 계산해야합니다.


F하자 Nn은 피보나치 수의 경우 번째

F 1 = 1,
F 2 = 2 및
모든 k > 2에 대해, F k = F k -1 + F k -2 입니다.

음이 아닌 정수 nZeckendorf 표현 Z ( n ) 은 양의 정수 세트입니다.

n = Σ i ∈ Z ( n ) F i   및
i ∈ Z ( n ) i + 1 ∉ Z ( n ).

(프로 사에서 : 숫자 n 의 Zeckendorf 표현은 양의 정수 세트로, 이들 지수에 대한 피보나치 수는 n 까지 합산 되며 두 개의 인접한 정수는 그 세트의 일부가 아닙니다)

특히, Zeckendorf 표현은 독특합니다. 다음은 Zeckendorf 표현에 대한 몇 가지 예입니다.

Z (0) = ∅ (빈 세트)
Z (1) = {1}
Z (2) = {2}
Z (3) = {3} ({1, 2}는 3의 Zeckendorf 표현이 아님)
Z (10) = {5, 2}
Z (100) = {3, 5, 10}

이 문제에서 Zeckendorf 표현은 비트 집합 으로 인코딩되며 여기서 최하위 비트 1가 집합의 일부인 경우 등을 나타냅니다. 입력 및 출력의 Zeckendorf 표현이 31 비트에 적합하다고 가정 할 수 있습니다.

당신의 작업은 계산 Z (이다 N + m ) 주어진 Z ( N )와 Z ( m ). 가장 짧은 옥텟 길이의 솔루션이 이깁니다.

ANSI C로 작성된 참조 구현은 여기 에서 찾을 수 있습니다 . Zeckendorf 표현을 생성하거나 Zeckendorf 표현에서 숫자를 계산하는 데에도 사용할 수 있습니다.

다음은 몇 가지 샘플 입력 및 출력 쌍입니다. 여기서 첫 번째 두 열에는 입력이 포함되고 세 번째 열에는 출력이 포함됩니다.

73865           9077257         9478805
139808          287648018       287965250
34              279004309       279004425
139940          68437025        69241105
272794768       1051152         273846948
16405           78284865        83888256
9576577         4718601         19013770
269128740       591914          270574722
8410276         2768969         11184785
16384           340             16724

4
입력 / 출력을 자세히 설명해 주시겠습니까?
flawr

@flawr 제공된 참조 구현을 살펴보십시오. 이를 사용하여 자체 샘플 입력을 생성 할 수 있습니다.
FUZxxl

3
내가 원하는대로 여기에 원하는 것을 정확하게 문서화하고 몇 가지 예를 제공 할 수 있다면 기쁠 것입니다. 아마도 다른 사람들도 C에 유창하지 않습니다.
flawr

나는 독창성 주장에 동의하지 않는다. 피보나치 수열은 1, 1, 2로 시작하므로 3을 F0 + F2 = 1 + 2 = 3으로 명확하게 분해 할 수 있습니다. F0과 F2는 인접 하지 않습니다 .
orlp

1
@orlp 여기에 정의 된 피보나치 수열은 F1 = 1 및 F2 = 2로 시작합니다. 그래서 내가 읽는 방식으로, 정의에서 F0은 여기에 사용 된 시퀀스의 일부가 아닙니다.
Reto Koradi

답변:


5

K (ngn / k) , 45 43 42 41 바이트

{2/<':(+/F@&+/'|2\x){y!x}\|F:64(+':1,)/0}

온라인으로 사용해보십시오!

@ 버블 러 알고리즘

{ } 인수 기능 x

64( )/0 0을 초기 값으로 사용하여 64 회 수행 :

  • 1, 앞에 1

  • +': 각각의 이전을 추가하십시오 (첫 번째 요소는 그대로 두십시오)

F:F"피보나치 수열"에 할당

| 역전

(.. ){y!x}\.. 왼쪽의 값부터 시작하여 오른쪽의 목록에 대한 누적 나머지 (왼쪽에서 오른쪽으로)를 계산하십시오. 왼쪽의 값은 zeckendorf 표현이없는 입력의 일반 합계입니다.

  • 2\x이진 입력을 인코딩합니다. 이것은 nbits-by-2 행렬입니다

  • | 역전

  • +/' 각각을 합하다

  • &1은 어디에 있습니까? -지수 목록. 2가 있으면 해당 인덱스가 두 번 반복됩니다.

  • F@ 배열 인덱싱 F

  • +/ 합집합

<': 각 이전보다 적음 (결과의 첫 번째는 항상 거짓 임)

2/ 이진 디코딩


10

CJam, 76 74 70 63 59 바이트

2q~{32{2\#I&},}fI+32_,*{WUer$Kf-[UU]/[-2X]*2,/2a*Kf+}fKf#1b

CJam 통역사 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인하십시오 .

생각

우리는 질문에서 약간의 시퀀스 변형을 정의하는 것으로 시작합니다.

k 가 음이 아닌 정수일 때마다 G -2 = 0
G -1 = 1
G k = G k-1 + G k-2

이러한 방식으로, 비트 어레이 입력 또는 출력 의 비트 0 (LSB)은 피보나치 수 G 0 및 일반적으로 비트 k 내지 G k에 대응한다 .

이제 Z (n)Z (m)의 각 세트 비트를 인코딩 된 인덱스로 바꿉니다.

예를 들어, 입력 532 10 = 1000010100 2[2 4 9] 로 변환됩니다 .

이것은 두 개의 정수 배열을 생성하며, 하나의 배열을 형성하기 위해 연결할 수 있습니다.

예를 들어, n = m = 100 이면 결과는 A : = [2 4 9 2 4 9] 입니다.

우리가 각각 교체하면 K 에서 의한 G의 K를 결과를 추가 우리 수득 N + m = 200 , 그래서 A가 인 분해 방법 200 확실히 Zeckendorf의 정리로부터 아닌 하나 피보나치 수열로, 그러나.

명심하는 것이 G K + G의 K + 1 = G의 K + 2G K + G의 K = G K + G는 K-1 + G K-2 = G K + 1 + G K-2 , 우리는 연속 대체 할 및 (즉, 타인 중복 인덱스 (K, K + 1) 에 의해 K + 2(K, K) 에 의해 (K + 1, K - 2) ) 그 치환을 반복은 반복해서 Zeckendorf 표현에 도달 할 때까지. 1

음수 색인을 생성하려면 특별한 경우를 수행해야합니다. 이후 G -2 = 0 , 지수는 -2 단순히 무시할 수 있습니다. 또한 G -1 = 0 = G 0 이므로 결과 -10 으로 대체되어야 합니다.

예제 A의 경우 다음과 같은 (정렬 된) 표현을 얻습니다. 마지막은 Zeckendorf 표현입니다.

[2244 9 9] → [04 34 9] → [05 9 9] → [05 9 9] → [0 6 7 10] → [0 8 10]

마지막으로 정수 배열에서 비트 배열로 다시 변환합니다.

암호

2             e# Push a 2 we'll need later.
q~            e# Read and evaluate the input.
{             e# For each integer I in the input:
  32{         e#   Filter [0 ... 31]; for each J:
    2\#       e#     Compute 2**J.
    I&        e#     Compute its logical AND with I.
  },          e#   Keep J if the result in truthy (non-zero).
}fI           e#
+             e# Concatenate the resulting arrays.
32_,*         e# Repeat [0 ... 31] 32 times.
{             e# For each K:
  WUer        e#   Replace -1's with 0's.
  $           e#   Sort.
  Kf-         e#   Subtract K from each element.
  [UU]/[-2X]* e#   Replace subarrays [0 0] with [-2 1].
  2,/2a*      e#   Replace subarrays [0 1] with [2].
  Kf+         e#   Add K to each element.
}fK           e#
f#            e# Replace each K with 2**K.
1b            e# Cast all to integer (discards 2**-2) and sum.

1 구현은 32 번 대체를 시도하고 실제로 Zeckendorf 표현에 도달했는지 확인하지 않습니다. 나는 이것이 충분하다는 공식적인 증거는 없지만 15 비트 표현의 가능한 모든 합계 (그들의 합계 표현에는 최대 17 비트가 필요함)를 테스트했으며 6 번의 반복으로 충분했습니다. 어쨌든 바이트 수를 늘리지 않고 반복 횟수를 99로 늘리는 것이 가능하지만 성능이 저하됩니다.


10

APL (Dyalog Extended) , 39 바이트

1↓⍧|/⌽(+/g[⍸⌽+/⊤⎕]),↑,\⌽g←(2+/,)⍣38⍨⍳2

온라인으로 사용해보십시오!

길이 2의 인수 하나를 사용하여 전체 프로그램으로 변경되었으며 피보나치 생성기도 변경되었습니다. 많은 아이디어를 주신 @ngn에게 감사합니다.

로 평가 ⎕IO←0되도록 사용 ⍳2합니다 0 1.

피보나치 생성기 (신규)

마지막 두 숫자는 정확하지 않지만 프로그램의 출력은 변경되지 않습니다.

(2+/,)⍣38⍨⍳2
 0 1 ((2+/,)⍣38) 0 1

Step 1
0 1 (2+/,) 0 1
 2+/ 0 1 0 1
 (0+1) (1+0) (0+1)  2+/ evaluates sums for moving window of length 2
 1 1 1

Step 2
0 1 (2+/,) 1 1 1
 2+/ 0 1 1 1 1
 1 2 2 2

Step 3
0 1 (2+/,) 1 2 2 2
 2+/ 0 1 1 2 2 2
 1 2 3 4 4

제켄 도르프에서 일반 (부분)으로

⍸⌽+/⊤⎕
        Take input from stdin, must be an array of 2 numbers
        Convert each number to base 2; each number is mapped to a column
  +/     Sum in row direction; add up the counts at each digit position
        Reverse
        Convert each number n at index i to n copies of i

APL (Dyalog Extended) , 47 바이트

g1↓(1,+\⍤,)⍣201
{⊥1↓⍧|/⌽⍵,↑,\⌽g}+⍥{+/g[⍸⌽⊤⍵]}

온라인으로 사용해보십시오!

이전 답변의 1 부에서 피보나치 수를 재사용하도록 변경되었습니다. 또한 중복 1을 삭제하여 다른 위치에 일부 바이트를 저장하십시오.

1 부 (신규)

{+/g[⍸⌽⊤⍵]}
       ⊤⍵     Argument to binary digits
     ⍸⌽       Reverse and convert to indices of ones
   g[    ]    Index into the Fibonacci array of 1,2,3,5,...
 +/           Sum

APL (Dyalog Extended) , 52 바이트

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}+⍥({+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤)

온라인으로 사용해보십시오!

작동 원리

Zeckendorf에서는 APL이 어레이의 개별 요소에 대한 작업으로 알려져 있지 않기 때문에 멋진 알고리즘을 추가하지 않습니다. 대신 Zeckendorf의 두 입력을 일반 정수로 변환하고 추가 한 다음 다시 변환했습니다.

제 1 부 : Zeckendorf에서 일반 정수로

{+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤   Zeckendorf to plain integer
                   Convert the input to array of binary digits (X)
{    (  ≢⊤⍵)  }     Take the length L of the binary digits and
      ⌽⍳              generate 1,2..L backwards, so L..2,1
{+∘÷⍣(     )⍨1}     Apply "Inverse and add 1" L..2,1 times to 1
                    The result looks like ..8÷5 5÷3 3÷2 2 (Y)
                   Mixed base conversion of X into base Y

Base |             Digit value
-------------------------------
13÷8 | (8÷5)×(5÷3)×(3÷22 = 8
 8÷5 |       (5÷3)×(3÷22 = 5
 5÷3 |             (3÷22 = 3
 3÷2 |                   2 = 2
 2÷1 |                   1 = 1

2 부 : 두 개의 일반 정수 추가

+⍥z2i   Given left and right arguments,
          apply z2i to each of them and add the two

제 3 부 : 합을 다시 Zeckendorf로 변환

"입력과 출력의 Zeckendorf 표현이 31 비트에 적합하다고 가정 할 수 있습니다."

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}   Convert plain integer N to Zeckendorf
                 (1,+\⍤,)⍣201    First 41 Fibonacci numbers starting with two 1's
                ⌽                ⍝ Reverse
             ↑,\                 ⍝ Matrix of prefixes, filling empty spaces with 0's
          ⌽⍵,                     Prepend N to each row and reverse horizontally
        |/                        Reduce by | (residue) on each row (see below)
                                 Nub sieve; 1 at first appearance of each number, 0 otherwise
  1↓¯1                           Remove first and last item
                                 Convert from binary digits to integer

피보나치 생성기

(1,+\⍤,)⍣201
 1 ((1,+\⍤,)⍣20) 1   Expand 
 Apply 1 (1,+\⍤,) x 20 times to 1

First iteration
1(1,+\⍤,)1
 1,+\1,1   Expand the train
 1,1 2     +\ is cumulative sum
 1 1 2     First three Fibonacci numbers

Second iteration
1(1,+\⍤,)1 1 2
 1,+\1,1 1 2   Expand the train
 1 1 2 3 5     First five Fibonacci numbers

20   ... Repeat 20 times

이것은 피보나치 수의 속성에서 비롯됩니다. 피보나치가 다음과 같이 정의 된 경우

F0=F1=1;n0,Fn+2=Fn+1+Fn

그때

n0,i=0nFi=Fn+21

그래서 누적 합계 1,F0,,Fn (1이 앞에 붙은 피보나치 배열)은 F1,,Fn+2. 그런 다음 인덱스 0으로 시작하는 일반적인 피보나치 배열을 얻기 위해 1을 다시 추가합니다.

피보나치에서 제켄 도르프까지

Input: 7, Fibonacci: 1 1 2 3 5 8 13

Matrix
0 0 0 0 0 0 13 7
0 0 0 0 0 8 13 7
0 0 0 0 5 8 13 7
0 0 0 3 5 8 13 7
0 0 2 3 5 8 13 7
0 1 2 3 5 8 13 7
1 1 2 3 5 8 13 7

Reduction by residue (|/)
- Right side always binds first.
- x|y is equivalent to y%x in other languages.
- 0|y is defined as y, so leading zeros are ignored.
- So we're effectively doing cumulative scan from the right.
0 0 0 0 0 0 13 7 → 13|7 = 7
0 0 0 0 0 8 13 7 →  8|7 = 7
0 0 0 0 5 8 13 7 →  5|7 = 2
0 0 0 3 5 8 13 7 →  3|2 = 2
0 0 2 3 5 8 13 7 →  2|2 = 0
0 1 2 3 5 8 13 7 →  1|0 = 0
1 1 2 3 5 8 13 7 →  1|0 = 0
Result: 7 7 2 2 0 0 0

Nub sieve (⍧): 1 0 1 0 1 0 0
1's in the middle are produced when divisor  dividend
(so it contributes to a Zeckendorf digit).
But the first 1 and last 0 are meaningless.

Drop first and last (1↓¯1↓): 0 1 0 1 0
Finally, we apply base 2 to integer (⊥) to match the output format.

6

하스켈, 325 396 바이트

편집 : 새 버전 :

s f[]=[]
s f l=f l
x((a:b):(c:d):(e:r))=x(b:d:(a:e):r)
x(a:b:((c:d:e):r))=x((c:a):b:e:((d:s head r):s tail r))
x[]=[]
x(a:r)=a:x r
w l|x l/=l=w.x$l|True=l
l=length
t n x=take n$repeat x
j 0=[]
j n=t(mod(n)2)1:j(div(n)2)
i n=[[],[]]++j n++t(32-(l$j n))[]
u[]=0
u(a:r)=2*u r+l a
o(_:a:r)=u r+l a
z a b=o$w$zipWith(++)(i a)(i b)

z 일을한다.


함수가 가장 우선 순위가 높은 일부 기능은 곧바로 단축 될 수 있습니다. 예를 들어 함수가 가장 우선 순위가 높으므로 함수 응용 프로그램에서 부모를 제거 할 수 있으며 보호자도 부모를 =필요로하지 않습니다. 등등, 그리고 :오른쪽에있는 동료들과 일부를 잘라낼 수 있습니다. 어쨌든 축하합니다! 매우 복잡해 보입니다. 이것이 어떻게 작동하는지 기다릴 수 없습니다!
자부심을 가진 haskeller

@proudhaskeller 쓸데없이 복잡하지만 편집 내용을 참조하십시오. 기본 아이디어를 설명할까요? 다른 방법이 더 나을 수도 있지만 처음에는 가능한 한 많은 패턴 일치를 시도했습니다. 아, 부모님은 괄호를 의미합니다 : 골프는 그거야!
Leif Willerts

chillax, 여기 처음입니다. 오래 머무르면 훨씬 나아질 것입니다. 통찰력 codegolf.stackexchange.com/questions/19255/…에
자랑스런 Haskeller

@proudhaskeller 편집이 도착했습니다 ...
Leif Willerts

4

ES6, 130 바이트

(n,m)=>{for(a={},s=0,i=x=y=1;i<<1;i+=i,z=y,y=x,x+=z)s+=((n&i)+(m&i))/i*(a[i]=x);for(r=0;i;i>>>=1)s>=a[i]?(s-=a[i],r|=i):0;return r}

원래 원래 (제대로 CJam 구현의 선을 따라) 합계를 계산하려고 시도했지만 임시로 계속 부족하므로 숫자를 실수로 변환하고 실수로 변환했습니다.

(예, 아마도 eval을 사용하여 바이트를 저장할 수 있습니다.)


1

루비 , 85 73 65 바이트

->*a{r=(0..2*a.sum).select{|r|r^r*2==r*3};r[a.sum{|w|r.index w}]}

온라인으로 사용해보십시오!

어떻게?

먼저 인코딩 된 합계의 상한을 얻습니다. (a + b) * 2는 괜찮습니다.

이제 (0..limit)에서 모든 제켄 도르프 숫자를 필터링하십시오.

룩업 테이블이 있는데 여기부터 내리막 길입니다.


1

파이썬 3, 207 바이트

def s(n):
 p=1
 while n>=2*p:
  p*=2
 return n if n<=p else s(n+p//2)if n>=3*p/2 else s(m)if (m:=s(n-p)+p)!= n else n
a=lambda n,m:(b:=n&m)>-1 and s(a(a(a(s((n|m)-b%4),b//4*2),b//4),b%4*2+b%4//2))if m else n

온라인으로 사용해보십시오! (모든 테스트 사례 확인)

설명

이 프로그램은 Zeckendorf 표현의 이진 번역을 직접 조작합니다. 이 함수 a(n,m)는 주 계산을 수행 s(n)하며 Zeckendorf 표현에 포함 된 인접 숫자를 제거하는 도우미 함수입니다.

s(n)명확성을 위해 확장 된 함수로 시작해 보겠습니다 .

def s(n): 
    p=1                  #This finds the highest digit of the binary form of n.
    while n>=2*p:
        p*=2
    if n<=p:             #If n is a power of two (i.e, our number is already a Fibonnaci number)...
        return n         #Then return it normally.  This also works for zero. (A)
    if n>=3*p/2:         #If n's first digit is followed by a 1 (i.e, it starts with 11X)
        return s(n+p//2) #Then replace that with 100X (B)
    m = s(n-p)+p         #Otherwise, apply s to the rest of the number (C)
    if m==n:             #If this is out final result, we're done! (D)
        return n
    return s(m)          #Otherwise, reapply it. (E)

예를 들어 숫자 107 ( 11010111 진, 2 진 +5 진 +13 진 + 21 = 42)은 다음과 같은 과정을 거칩니다.

1+2+5+13+21 [1101011] -> 1+2+5+34 [10001011] (B)
1+2+5+34 [10001011] (C)
 1+2+5 [1011] (C)
  1+2 [11] -> 3 [100] (B)
 ->3+5 [1100] (A/E)
 (E):  3+5 [1100] -> 8 [10000] (B)
->8+34 [10010000] (A/E)
(E): 8+34 [10010000] (C)
->8+34 [10010000] (A/E)

온라인으로 사용해보십시오! (상세 출력 포함)

다음은 확장 버전입니다 a(n,m).

def a(n,m):
    if m==0:
        return n
    b=n&m
    t=s((n|m)-b%4)              #(A)
    t=a(t,b//4*2)               #(B)
    t=a(t,b//4)                 #(C)
    return s(a(t,b%4*2+b%4//2)) #(D)

이 함수는 두 개의 Zeckendorf 표현을 결합하기 쉬운 네 개의 이진수로 변환합니다. 라인 (A)는 두 개의 이진 Zeckendorf 표현의 비트 단위 OR입니다. 이들은 두 그룹의 각 피보나치 수의 사본 하나에 해당합니다. (B)와 (C)는 각각 1과 2 번 오른쪽으로 시프트 된 두 숫자의 비트 AND입니다. 우리는 (B) 및 (C)에 대응 피보나치 수열 함께 첨가 될 때,이 비트 단위로하고 동등한 것이라고 알 nmF (N) = F (N-1) + F 때문에, (N-2) .

예를 들어 이진수 n = 101001 (1 + 5 + 13에 해당)과 m = 110110 (2 + 3 + 8 + 13)이 있다고 가정 해 보겠습니다. 그런 다음 (A) = 111111 (1 + 2 + 3 + 5 + 8 + 13)을 갖게됩니다.이 함수 s는 (B) = 10000 (8) 및 ( C) = 1000 (5). (1 + 5 + 13) + (2 + 3 + 8 + 13) = (3 + 8 + 21) + (8) + (5) = 45임을 확인할 수 있습니다. 이 프로세스는 ((3 + 8 + 21) + (8)) + (5) = ((3 + 8 + 21) + (5) + (3)) + (5) 등으로 반복됩니다.

이 시스템의 한 가지 어려움은 피보나치 수 1과 2에 대해 작동하지 않는다는 것입니다. 피보나치 수는 속성에 순종하지 않기 때문에 F(n)=F(n-1)+F(n-2)(두 숫자가 가장 낮습니다)! 이로 인해 1 또는 2가 모두 n및에 포함될 때마다 mA, B 및 C에서 제거되고 그 합은 1 + 1 = 2 및 2 + 2 = 1 + 3이라는 속성 아래 D에 배치됩니다. 예를 들어 1 + 3 (101) + 1 + 3 + 5 (1101)를 추가하면 다음과 같이됩니다.

(A) : 3 + 5 (1100) = 8 (10000)

(B) : 2 (10)

(C) : 1 (1)

(D) : 2 (10)

3과 5가 A에 배치되고, 중복 3이 B와 C에서 2 + 1로 분리되고, 복제 1이 A, B 및 C에서 제거되고 함께 추가 된 다음 D에 배치됩니다. 2 + 3 (110) + 2 + 3 + 5 (1110)를 추가하면 다음과 같습니다.

(A) : 3 + 5 (1100) = 8 (10000)

(B) : 2 (10)

(C) : 1 (1)

(D) : 1 + 3 (101)

온라인으로 사용해보십시오! (상세한 출력을 가진)


0

Wolfram Language (Mathematica) , 218 바이트

Fold[#+##&,Total@PadLeft@IntegerDigits[#,2]//.{{p=n_/;n>1,r=y___}:>{0,n,y},{q=x___,i_,p,j_,k_,r}:>{x,i+1,n-2,j,k+1,y},{q,i_,p,j_}:>{x,i+1,n-2,j+1},{q,i_,p}:>{x,i+1,n-2},{1,1,r}:>{1,0,0,y},{q,i_,1,1,r}:>{x,i+1,0,0,y}}]&

온라인으로 사용해보십시오!

단순히 패턴 매칭.

언 골프 드 :

FromDigits[Total@PadLeft@IntegerDigits[#, 2] //.
   {{n_ /; n > 1, y___} :> {0, n, y},
    {x___, i_, n_ /; n > 1, j_, k_, y___} :> {x, i + 1, n - 2, j, k + 1, y},
    {x___, i_, n_ /; n > 1, j_} :> {x, i + 1, n - 2, j + 1},
    {x___, i_, n_ /; n > 1} :> {x, i + 1, n - 2},
    {1, 1, y___} :> {1, 0, 0, y},
    {x___, i_, 1, 1, y___} :> {x, i + 1, 0, 0, y}}, 2] &
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.