정렬되지 않은 목록에서 두 개의 정수를 찾아 입력에 합산


13

이것은 Google 인터뷰 질문입니다. YouTube 링크는 여기를 참조하십시오.

작업:

순서가없는 목록에서 주어진 정수에 해당하는 2 개의 정수를 찾으십시오.

  1. 순서가 정해지지 않은 정수 목록이 주어지면 주어진 값에 해당하는 2 개의 정수를 찾고이 2 개의 정수를 인쇄하고 성공을 나타냅니다 (종료 0). 그것들은 특정 숫자 일 필요는 없습니다 (즉, 올바른 숫자에 합산되는 처음 2 개의 정수). 값에 합치는 모든 쌍이 작동합니다.
  2. 정수는 양수이고 0보다 큽니다.
  3. 정수 목록은 정수 파일-행당 하나의 정수를 포함하여 모든 데이터 구조에있을 수 있습니다.
  4. 정수를 찾을 수 없으면 실패를 나타냅니다 (종료 1).
  5. 리스트에서 다른 위치에있는 두 개의 정수가 리턴되어야합니다. (즉, 같은 위치에서 같은 숫자를 두 번 반환 할 수 없습니다)

(참고 : 비디오에서는 이것이 요구 사항이 아닙니다. '인터뷰어'는 여러 차례 바뀌 었습니다.)

예.

sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF

인쇄 35종료 상태는이 0으로 참고 인 1,72,6도 결과가 허용됩니다.

sum2 8 <<EOF
1
2
3
4

가능한 콤보가 없으므로 종료 상태 1을 리턴합니다. 4,4규칙 5에 따라 허용되지 않습니다.


15
샌드 박스 에서 느슨한 부분을 먼저 떨쳐 낼 기회가 있다면 이것은 큰 의문이 될 수 있습니다 . 예를 들어, 이와 같은 경우 허위 값이나 숫자 쌍을 반환하는 함수를 작성해야합니다.
Neil

2
이 예에서 반환 된 쌍이 (1,7)이 아닌 (3,5) 인 이유는 무엇입니까?
Rod

4
순서가없는 목록에 "첫 번째"쌍이있는 방법은 무엇입니까? 그것은 본질적으로 자기 모순이다.
피터 테일러

23
나는 출구 0 / 출구 1이 좋은 생각이라고 생각하지 않습니다. 많은 언어는 그렇게 쉽게 존재할 수 없으며, 일반적으로 오류로 종료 할 수 있습니다 (예 : STDERR 무시). 많은 골프 언어는 종료 코드로 쉽게 종료 할 수 없습니다.
Rɪᴋᴇʀ

2
두 번째 생각으로, 일부 답변은 종료 코드 1을 생성하기 위해 약간의 노력을 기울 였으므로 지금 요구 사항을 변경하지 않는 것이 좋습니다.
Luis Mendo

답변:


5

배쉬, 84 바이트

Google 엔지니어의 솔루션을 거의 구현했지만 bash와 입력 스트림을 사용했습니다. 내 솔루션이 아니므로 계산에 포함되지 않습니다.

while read V;do((V<$1))&&{ ((T=R[V]))&&echo $T $V&&exit;((R[$1-V]=V));};done;exit 1

방법

목표 $ 1보다 적은 경우 입력 스트림에서 정수 V를 읽을 수 있지만 이미 $ 1-V를 본 경우 $ 1-V와 V를 인쇄하고 0을 입력하고 그렇지 않으면 입력 $ 1-V exit 1 후보를 저장하십시오.


4

Brachylog , 9 바이트

h⊇Ċ.+~t?∧

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

내가 도전을 올바르게 이해했다고 가정하면…

설명

h⊇Ċ          Ċ ('couple') has two elements, and is a subset of the head of the input
  Ċ.         Output = Ċ
   .+~t?     The sum of the elements of the Output is the tail of the Input
        ∧    (disable implicit unification)

4

펄 6 , 59 바이트

$_=get;put lines().combinations(2).first(*.sum==$_)//exit 1

시도하십시오
가능한 결과없이 시도하십시오

넓히는:

$_ = get;            # get one line (the value to sum to)

put                  # print with trailing newline
    lines()          # get the rest of the lines of input
    .combinations(2) # get the possible combinations
    .first(          # find the first one
      *.sum == $_    # that sums to the input
    )
  //                 # if there is no value (「Nil」)
    exit 1           # exit with a non-zero value (「put」 is not executed)

4

자바 스크립트 ES6, 58 70 68 64 바이트

a=>b=>{for(i in a)if(a.includes(b-a[i],i+1))return[a[i],b-a[i]]}

발견되면 배열 형식으로 숫자 쌍을 리턴하고, 그렇지 않으면 undefined거짓 값을 리턴 합니다.

f=a=>b=>{for(i in a)if(a.includes(b-a[i],i+1))return[a[i],b-a[i]]}

console.log(f([1,7,4,6,5,3,8,2])(8));
console.log(f([1,2,3,4,5,6,7,8])(8));
console.log(f([1,2,3,4])(8));
console.log(f([2,2])(4));


예를 3, 5들었지만이 결과는 1, 7...
Neil

@ Neil, 죄송합니다. 엉망이되어서 규칙을 수정했습니다. 1,7은 괜찮습니다.
Philcolbourn

1
작동하지 f([2,2] 4)않습니까?
cliffroot

1
@cliffroot는 지금이 경우 작동합니다
Tom

1
좋은 includes트릭.
Neil

4

자바 스크립트 (ES6), 61 57 56 바이트

카레 구문에서 정수 배열 a과 예상 합계 s를 가져옵니다 (a)(s). 일치하는 정수 쌍을 배열로 반환하거나 undefined해당 쌍이없는 경우 해당 쌍을 반환 합니다.

a=>s=>(r=a.find((b,i)=>a.some(c=>i--&&b+c==s)))&&[r,s-r]

형식화 및 의견

a =>                      // given an array of integers (a)
  s => (                  // and an expected sum (s)
    r = a.find((b, i) =>  // look for b at position i in a such that:
      a.some(c =>         //   there exists another c in a:
        i-- &&            //     - at a different position
        b + c == s        //     - satisfying b + c == s
      )                   //   end of some()
    )                     // end of find(): assign the result to r
  ) &&                    // if it's not falsy:
  [r, s - r]              // return the pair of integers

테스트


3

젤리 , 14 바이트

ŒcS=⁹$$ÐfḢṄo⁶H

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

표준 출력으로 출력하는 기능 (전체 프로그램 아님)입니다. TIO 링크에는 함수를 실행하고 반환 값을 무시하는 래퍼가 있습니다.

종료 코드 요구 사항이 아닌 경우이 프로그램은 4 바이트 더 짧을 수 있습니다. Jelly에서 종료 코드 1을 반환하는 것은 매우 어렵습니다. (내가 놓친이를 수행하는 더 확실한 방법이있을 수 있습니다.)

설명

ŒcS=⁹$$ÐfḢṄo⁶H
Œc                All pairs of values from {the first argument}
       Ðf         Take only those which
  S=⁹               sum to {the second argument}
     $$           Parse the preceding three builtins as a group
         Ḣ        Take the first result (0 if there are no results)

          Ṅ       Output this result (plus a newline) on standard output
           o⁶     If this value is falsey, replace it with a space character
             H    Halve every element of the value

우리는 모든 정수를 한 쌍으로 반으로 나눌 수 있으므로 o⁶H결과를 발견하면 아무런 관련이없는 쓸모없는 반환 값을 반환하는 것 외에는 아무것도하지 않습니다 ( 함수의 반환 값을 결정하는 편리한 단일 바이트 방법으로 사용됩니다) PPCG 규칙에 따라 조기에 가치를 평가). 그러나 결과를 찾지 못하면 공백 문자를 절반으로 줄이려고 시도합니다. 연산은 무의미하므로 젤리 인터프리터가 충돌합니다. 다행히이 충돌은 종료 코드 1을 생성합니다.


3

펄 5 , 51 바이트

46 바이트의 코드 + -pli플래그의 경우 5 바이트

$\="$_ $v"if$h{$v=$^I-$_};$h{$_}=1}{$\||exit 1

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

아이디어는 입력 목록에서 반복하는 것입니다. 숫자 x( $_)에서 이전에 본 n-x( $^I-$_)을 찾은 경우 찾고 있던 것을 찾은 다음 $\이 두 값 ( "$_ $v")으로 설정 했습니다 . 마지막에 $\설정되어 있지 않으면 우리 exit 1는 그렇지 않으면 암시 적으로 인쇄됩니다.


두 문자 대신 리터럴 탭이 작동합니까 ^I?

@ ais523 할 수없는 것 같습니다. 그래도 이전 버전의 Perl에서 가능했을 수 있습니다.
Dada

3

로다 , 60 56 바이트

f s,a{seq 1,s|{|x|[[x,s-x]]if[x in a,s-x in a-x]}_|pull}

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

응답이 없으면이 코드에서 오류가 발생합니다. 합을 형성 할 수있는 모든 가능한 쌍을 생성합니다 s. 1, s-1, 2, s-2, 3, s-3, ... 그 다음 두 숫자 어레이에 있는지 점검 a하고, 그렇다면, 스트림에 푸시. pull스트림에서 하나의 값을 읽고 리턴합니다. 스트림에 값이 없으면 오류가 발생합니다. 제거 a-x된 배열 a을 반환합니다 x.


3

파이썬 2, 60 바이트

코드 1로 종료하는 규칙이 명확해질 때까지이 요약입니다. 아무것도 발견되지 않으면 이제 오류와 함께 종료됩니다.

@Peilonrayz 덕분에 -5 바이트

@Rod 덕분에 -4 바이트

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

a,s=input()
while a:
 x=a.pop()
 if s-x in a:r=s-x,x
print r

@Peilonrayz 그것을 몰랐습니다, 감사합니다!
Dead Possum

@Peilonrayz 이것은 fith 규칙을 위반 합니다. 목록의 다른 위치에있는 두 개의 정수가 반환되어야합니다. (즉, 같은 위치에서 같은 숫자를 두 번 반환 할 수 없습니다)
Dead Possum

3
당신은 할 수 있습니다 혼합 들여 쓰기 공간 + 탭을 사용하여 2 바이트를 줄이거 나하는 스위치를input() 4 바이트 감소
로드

@로드 감사합니다! 입력이 더 좋아 보인다
Dead Possum

2
@Eric Duminil 그래. eval(raw_input())(나는 생각한다) 와 동등하다 .
Yytsi

2

C ++ 133 바이트 (clang 4 및 gcc 5.3 -std = c ++ 14로 컴파일 됨)

#include <set>
auto f=[](auto s,int v,int&a,int&b){std::set<int>p;for(auto i:s)if(p.find(i)==end(p))p.insert(v-i);else{a=v-i;b=i;}};

C 108 바이트

void f(int*s,int*e,int v,int*a,int*b){do{int*n=s+1;do if(v-*s==*n){*a=*s;*b=*n;}while(++n<e);}while(++s<e);}

1
사이트에 오신 것을 환영합니다! 불행하게도, 당신이 15 바이트를 추가 할 필요가 있다고 생각 #include <set>하고 대한 몇 가지 더 std::set. 주위에 중괄호를 제거하면 일부 바이트를 절약 할 수 있지만p.insert(v-i);
James

@DJMcMayhem 감사합니다. 그래서 main ()을 포함시켜야합니까?
em2er

@ em2er 아니요, 포함하지 않아도됩니다 main. 우리는 (도전에서 달리 언급하지 않는 한) 기능이 유효한 제출이라고 생각합니다. (btw 사이트에 오신 것을 환영합니다!)
Dada

아니요, 기능 제출이 좋습니다. (입력을 인수로 취할 수 있기 때문에 훨씬 짧습니다.) 제출에 필요한 포함을 계산하면됩니다.
James

1
@DJMcMayhem @Dada 감사합니다! 내가 함께 잘 모르겠습니다 end도 있지만없는 GCC에서 컴파일 std::(물론하지 않을 경우 설정)
em2er

2

하스켈 , 34 바이트

(n:v)#s|elem(s-n)v=(n,s-n)|1<2=v#s

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

목록의 각 요소에 대해이 함수는 (sum-element)가 목록의 다음 부분에 있는지 확인합니다. 찾은 첫 번째 커플을 리턴합니다. 함수가 목록의 끝에 도달하면 "비 완전 패턴"오류가 발생하고 코드 1로 종료됩니다.


이 방법이와 같은 입력에 작동하지 않을까 걱정 [2,2]#4됩니다.
Laikoni

@Laikoni 감사합니다, 나는 그 도전을 충분히 읽지 못했습니다. 이 새 버전은 정확하고 짧아야합니다.
Leo

2

PowerShell, 109 97 바이트

param($i,$a)($c=0..($a.count-1))|%{$c-ne($f=$_)|%{if($a[$f]+$a[$_]-eq$i){$a[$f,$_];exit}}};exit 1

AdmBorkBork가 제안한 12 바이트 거래

설명

# Get the parameter passed where $i is the addition target from the array of numbers in $a
param($i,$a)

($c=0..($a.count-1))|%{
    # We are going to have two loops to process the array elements.
    # The first loop element will be held by $f
    $f=$_
    # Create a second loop that will be the same as the first except for the position of $f to
    # prevent counting the same number twice. 
    $c|?{$_-ne$f}|%{
        # Check if the number at the current array indexes add to the target value. If so print and exit.
        if($a[$f]+$a[$_]-eq$i){$a[$f],$a[$_];exit}        
    }

}
# If nothing was found in the loop then we just exit with error.
exit 1

현재 규칙은이 작업을 수행하는 종료 코드를 찾습니다. 그것들은 제거 될 수 있으며 반환 된 숫자와 거짓을 확인하십시오.

샘플 사용법

위 코드가 함수로 저장된 경우 s

s 8 @(1,2,3,4)
s 8 @(1,7,4,6,5,3,8,2) 

제거 $c하고 아래쪽으로 반복 하여 몇 바이트를 더 절약 할 수 있습니다.($a.count-1)..1|%{$f=$_;--$_..0|%{if...
AdmBorkBork

2

R, 49 바이트

function(x,y){r=combn(x,2);r[,colSums(r)==y][,1]}

이것은 모든 2 개의 조합을 찾아 x행렬을 반환합니다. 그런 다음 열을 기준으로 합계하고 동일한 모든 합계를 찾습니다 y( [,1]끝 부분 이 없으면 합계가 같은 모든 조합을 인쇄합니다 y)


2

Japt , 9 바이트

@ETHproductions 덕분에 많은 바이트를 절약했습니다.

à2 æ_x ¥V

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

설명

à2 æ_x ¥V
à2         // Creates all combinations of the input, length 2
   æ       // Returns the first item where:
    _x     //     The sum of the two items in each set
       ¥V  //     == Second input   

Input:        [1,2,3], 4
à2         // [[1,2],[1,3],[2,3]]
   æ_x     // [3,    4,    5    ]
       ¥V  //  3!=4, 4==4 ✓
Output:    //  1,3

2

자바 스크립트, 114 96 86 84 바이트

a=>b=>{c=b.length;for(x=0;x<c;x++)for( y=x;++y<c;)if(b[x]+b[y]==a)return[b[x],b[y]]}

@Cyoce 덕분에 1 바이트 절약 및 @ETHProductions 덕분에 8 바이트 절약

주어진 입력에 합치거나 일치하지 않는 목록 요소의 첫 번째 조합으로 튜플을 반환합니다. var함수 에서 s를 제거했습니다 . REPL.it이 없으면 충돌하지만 Chrome Dev Console 은이를 잘 처리합니다 ...

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


챌린지가 유효하지 않은 입력을 요청하기 때문에 코드 1을 종료하지 않습니다. 현재로서는 잘못된 답변이지만 OP를 쉽게 수행 할 수없는 언어에 대한 요구 사항에 대해 문의했습니다.
Rɪᴋᴇʀ

@Matt 예, 그 규칙이 준수 y=x+1됩니다.
steenbergh

1
a=>b=>...바이트를 저장하는 데 사용할 수 있습니다
Cyoce

1
을 사용하여 다른 3 바이트를 저장할 수 있습니다 for(y=x;++y<b.length;){. 또한 가장 바깥 쪽을 제외한 모든 버팀대 세트를 제거 할 수 있으며 이후 공간을 제거 할 수 있습니다.return
ETHproductions

1

클로저, 77 바이트

#(first(mapcat(fn[i a](for[b(drop(inc i)%):when(=(+ a b)%2)][a b]))(range)%))

첫 번째 쌍 또는를 반환합니다 nil.


1

하스켈, 62 바이트

r=return;s#[]=r 1;s#(a:b)|elem(s-a)b=print(a,s-a)>>r 0|1<2=s#b

나는 여전히 챌린지가 무엇을 허용하고 무엇을 허용하지 않는지 모른다. 솔루션이 있으면 숫자 쌍을 인쇄하고 0을 반환하고 아무것도 인쇄하지 않고 솔루션이 없으면 1을 반환하는 함수를 사용하려고합니다. 인쇄가 I / O이므로 리턴 값을 IO-Monad (를 통해 return) 로 들어 올려야 하며 실제 기능 유형은입니다 Num a => IO a.

사용 예 (repl에 의해 반환 된 값으로 인쇄) :

*Main> 4 # [2,2]
(2,2)
0

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

예외 발생이 허용되면 fail일부 바이트 (총 51 개)가 저장됩니다.

s#[]=fail"";s#(a:b)|elem(s-a)b=print(a,s-a)|1<2=s#b

1

젤리 , 9 바이트

ŒcS=¥ÐfḢZ

Jelly는 종료 코드를 임의의 값으로 설정하는 방법이 없으므로 유효한 해석없이 입력에 대한 TypeError 가 발생하여 상위 인터프리터가 종료 코드 1 로 종료됩니다 .

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

작동 원리

ŒcS=¥ÐfḢZ  Main link. Argument: A (array of integers), n (integer)

Œc         Yield all 2-combinations of different elements of A.
     Ðf    Filter by the link to the left.
    ¥        Combine the two links to the left into a dyadic chain.
  S            Take the sum of the pair.
   =           Compare the result with n.
       Ḣ   Head; extract the first pair of the resulting array.
           This yields 0 if the array is empty.
        Z  Zip/transpose the result.
           This doesn't (visibly) alter pairs, but it raise a TypeError for 0.

1

노바 , 101 바이트

q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.remove(0))}))return [y,x-y];System.exit(1)}

코드 골프의 한 가지 좋은 점은 내 언어로 버그를 찾는 데 도움이된다는 것입니다. 예를 들면 공간 사이에 필요 return하고 [y,x-y].

푸시 / 팝 함수를 Array.nova에 추가하고 리턴을 수정하면 96 바이트가됩니다.

q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.pop())}))return[y,x-y];System.exit(1)}

용법:

class Test {
    static q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.remove(0))}))return [y,x-y];System.exit(1)}

    public static main(String[] args) {
        Console.log(q([1, 2, 3, 4, 5], 8)) // [5, 3]
        Console.log(q([1, 2, 3, 4, 5], 5)) // [1, 4]
        Console.log(q([1, 2, 3, 4], 8)) // exit code 1
    }
}

편집 : 또한 73 바이트 (pop을 사용하는 69) 에도이 방법이 있습니다.

q(Int[] a,Int x)=>[Int y=a.firstOrThrow({a.contains(x-a.remove(0))}),x-y]

firstOrThrow는 예외를 throw하며,이 예외는 포착되지 않으므로 결국 종료 코드 1로 프로그램을 종료합니다.;)

이 방법은 더 읽기 쉽습니다.


0

Pyth, 12 바이트

hfqsThQ.ceQ2

설명

       .ceQ2   Get all pairs from the second input
 fqsThQ        Find the ones whose sum is the first input
h              Take the first (exits with error code 1 if there aren't any)

0

PHP, 88 바이트

for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)if($a+$b==$argv[1])die("$a $b");die(1);

명령 줄 인수에서 입력을 가져옵니다 (먼저 합계). 로 실행하십시오 -nr.

다행히 문자열을 매개 변수로 지정하면 die/가 exit종료됩니다 0.

루프를 하나로 병합하려고했습니다. 그러나 이번에는 더 긴 초기화와 테스트가 필요합니다.


안 좋은 날? for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);codegolf.stackexchange.com/questions/120803/…을
Jörg Hülsermann 2016 년

0

수학, 76 바이트

f::e="1";If[(l=Cases[#~Subsets~{2},x_/;Tr@x==#2])=={},Message@f::e,First@l]&

매우 간단합니다 : #~Subsets~{2}리스트의 2 요소 서브 세트를 모두 얻은 다음 Cases[...,x_/;Tr@x==#2]합계가 원하는 숫자 인 것을 선택합니다. 이들 중 하나가 없으면 If[l=={}, Message@f::e,First@l]오류 메시지를 인쇄합니다f::e : 1 앞에서 정의한 를 (Mathematica에 대해 "종료 상태 1"이 무엇을 의미하는지 알 수 없기 때문에). 그렇지 않으면, 올바른 것으로 합친 쌍의 목록에서 첫 번째 항목을 반환합니다.

이상한 종료 상태를 수행하는 대신 잘못된 값을 반환 할 수 있다면 다음 코드에는 58 바이트가 있습니다.

If[(l=Cases[#~Subsets~{2},x_/;Tr@x==#2])=={},1<0,First@l]&

0

스칼라, 55 41 바이트

(l,n)=>l combinations 2 find(_.sum==n)get

두 숫자가 있으면 목록을 반환하고 그렇지 않으면 오류를 발생시킵니다. 잡히지 않으면이 오류는 종료 상태가 1이됩니다.


0

루비, 53 48 바이트

->a,s{p(a.combination(2).find{|x,y|x+y==s})?0:1}

입력 : a는 목록이고 s는 예상 합계입니다.

2 개의 숫자가 발견되면 숫자를 인쇄하고 0을 반환하고, 그렇지 않으면 사양에서와 같이 1을 반환합니다.


0

TI 기본, 59 바이트

Prompt L1
Prompt X
While 1
L1(1→B
seq(L1(C),C,2,dim(L1→L1
If sum(not(X-L1-B
Then
Disp B,X-B
Return
End
End

설명:

Prompt L1               # 4 bytes, input array like "{1, 2, 3}"
Prompt X                # 3 bytes, Input target sum
While 1                 # 3 bytes, until the list is empty
L1(1→B                  # 7 bytes, try the first element (now B)
seq(L1(C),C,2,dim(L1→L1  # 18 bytes, remove first element from list
If sum(not(X-L1-B       # 10 bytes, if any element in the list plus B is the target
Then                    # 2 bytes, then...
Disp B,X-B              # 7 bytes, print it and it's "complement"
Return                  # 2 bytes, and exit gracefully
End                     # 2 bytes
End                     # 1 byte

프로그램이 정상적으로 종료되지 않은 경우, 목록에 요소가 부족하여 계속할 수 없으면 오류가 발생합니다.


0

CJam, 23 바이트

l~_,1>{e!2f<::+#)}{;;}?

입력은 sum numbers입니다. 예를 들면 다음과 같습니다 6 [3 2 3].. 진리의 경우 양수, 빈 문자열 또는 거짓의 경우 0을 남깁니다.

설명:

l~    e# Read input and evaluate:  | 7 [3 2 3]
_     e# Duplicate:                | 7 [3 2 3] [3 2 3]
,     e# Take the length:          | 7 [3 2 3] 3
1>{   e# If more than 1:           | 7 [3 2 3]
  e!  e#   Unique permutations:    | 7 [[2 3 3] [3 2 3] [3 3 2]]
  2f< e#   Slice each to length 2: | 7 [[2 3] [3 2] [3 3]]
  ::+ e#   Some each:              | 7 [5 5 6]
  #   e#   Index:                  | -1
  )   e#   Increment:              | 0
}{    e# Else:                     | 7 [3 2 3]
  ;   e#   Pop                     | 7
  ;   e#   pop                     |
}?    e# Endif
e# Implicit output: 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.