32 비트 아키텍처에서 가능한 모든 숫자를 포함하는 파일이 제공됩니다. 해당 파일에서 4 개의 숫자가 누락되었습니다. 4 개의 누락 된 숫자 찾기


22

이것은 몇 번에 걸쳐 진행 된 인터뷰 질문이며 4 개의 숫자가 누락 된 경우 어떻게 해결할 수 있는지 잘 모르겠습니다. 하나 또는 두 개의 숫자가 누락되었음을 찾는 알고리즘에 익숙하지만 둘 중 하나를 4로 일반화하는 방법을 볼 수 없습니다.


답변:


19

면접이든 실제 작업이든, 우선 순위는 자신에게 맞는 효과적인 솔루션 이어야 합니다 . 그것은 일반적으로 당신은 당신이 간단 생각할 수있는 최초의 솔루션을 제공하고 쉽게에 대한한다는 뜻 설명합니다.

저에게는 숫자를 정렬하고 간격을 스캔 하는 것을 의미 합니다. 그러나 저는 비즈니스 시스템과 웹 앱에서 일합니다. 나는 비트와 함께 바이올린을 피우지 않으며 팀이 싫어요!

저수준의 금속에 가까운 직업에 대해 인터뷰하는 경우, "정렬"은 아마도 빈 응시로 만날 것입니다. 그들은 당신이 비트 등에 대해 편안하게 생각하기를 원합니다. 첫 번째 대답은 "아, 나는 비트 맵을 사용할 것입니다." (또는 비트 배열 또는 비트 세트)

그리고 어느 쪽이든-틀린 해결책을 제시 하더라도, 면접관 (또는 상사!)이 압박을 가하면 관리자의 특정 관심 영역에 초점을 맞추고 개선 또는 대안을 제안 할 수 있습니다.

  • 극도로 제한된 RAM? 512MB 미만?
    디스크에서 제자리에 정렬하십시오. 대부분 임의의 RAM을 사용하여 정렬 블록을 최적화 및 / 또는 버퍼링 할 수 있습니다.
  • 제한된 시간?
    그 RAM을 사용하십시오! 정렬은 이미 O(n*log(n))있습니다. (또는 정수 버킷 정렬의 경우 O (n)!)
  • 유지 보수성?
    정렬보다 더 쉬운 방법은 무엇입니까?!
  • 비트 플래그 / 필드에 대한 지식을 보여주지 않습니까? ( BitSet/ BitMap/ BitArray)
    음 OK ... 앞서 가서를 사용 BitArray플래그에 "찾을 수 있습니다." 그리고를 검색하십시오 0.
  • 예측 가능한 "실시간"복잡성?
    비트 맵 솔루션을 사용하십시오. 그것은 파일을 통해 단일 패스와 오버 다른 패스의BitArray/BitSet(찾기 위해0'들). 그렇습니다O(n).

또는 무엇이든.

실제로 우려 사항을 해결하십시오 . 필요한 경우 순진한 솔루션을 사용하여 먼저 문제를 해결하십시오. 아직 존재하지 않는 문제를 해결하기 위해 모든 사람의 시간을 낭비하지 마십시오.


디스크를 제외하고 순진한 접근 방식으로 40 억 숫자를 정렬하는 타당성이 확실하지 않습니다. 그러나 그것을 시도한 적이 없습니다.
Eiko

1
@ 아이코 글쎄 ... 요점은 ... 복잡한 일을하지 마십시오. 첫 번째 단계는 순진한 경우에도 문제를 해결하는 방법입니다. 당신이있는 거 지출 시간 반복하는 확인 사업이 단지 필요로 할 때 당신이 "오른쪽"솔루션을 가지고 있는지 확인하는 경우 난 당신의 미래의 고용주가있을 것이다 좌절의 수준을 강조 할 수 솔루션을. 둘 다 할 수 있음을 증명하십시오! 문제를 빠르게 해결 한 다음, 필요에 따라 리팩토링 및 / 또는 최적화 할 가치가있는 잠재적 인 문제를 식별 할 수 있음을 증명하십시오 .
svidgen

1
@Ewan "인터뷰에서 질문을했기 때문에"는 "모든 관리자가 찾고있는 특정 답변이 하나 있습니다."와 동일하지 않습니다. ... 문제를 해결할 수있는 능력을 보여 주었고 결코 당신에게주지 않은 문제를 해결하지 않는 한, 당신이 나에게 어떤 해결책을 주 었는지 상관하지 않을 것입니다!
svidgen

1
요점이 없습니다. 이 질문과 그 변형은 프로그래밍 퍼즐과 인터뷰 질문에서 발생합니다. 질문하는 사람이 만든 것은 아닙니다. 32 비트 물건은 숫자를 추적하거나 정렬하여 수행 할 수 없도록해야합니다. 컴퓨터가 쓰여진 이후로 더 빨라졌습니다.
Ewan

1
@Ewan : 질문의 인스턴스가 OP와 동일한 제약 조건을 가지고 있다고 가정합니다. OP는 자신의 알고리즘이 32 비트 컴퓨터에서 실행되어야한다고 말하지 않았으며, 컴퓨터에서 전혀 실행해야한다고 말하지 않았으며 개념적 알고리즘이 적합 할 수 있습니다. 또한 8 비트 마이크로 컨트롤러에서도 임의의 크기의 정수 수학이 가능하기 때문에 "모든 가능한 숫자"의 의미를 밝히지 않았습니다. 절대적인 진술을하려는 많은 가정들이 있습니다.
whatsisname

19

파일이기 때문에 여러 번 통과 할 수 있다고 가정합니다. 먼저 256 카운터의 배열을 만들고 파일을 반복하고 각 숫자마다 숫자의 첫 번째 바이트로 인덱싱 된 카운터를 증가시킵니다. 완료되면 대부분의 카운터는 2 ^ 24에 있어야하지만 1 ~ 4 개의 카운터는 더 낮은 값을 가져야합니다. 이러한 각 색인은 누락 된 숫자 중 하나의 첫 번째 바이트를 나타냅니다 (4보다 작은 경우 여러 누락 된 숫자가 동일한 첫 번째 바이트를 공유하기 때문입니다).

이러한 각 인덱스에 대해 256 카운터의 다른 배열을 만들고 파일을 다시 통과시킵니다. 이 시간은, 첫번째 바이트는 이전의 값 중 하나 인 경우에 기초하여 그것의 배열에서 카운터를 증가 바이트를 . 완료되면 2 ^ 16보다 낮은 카운터를 다시 찾아보고 누락 된 숫자의 두 번째 바이트를 각각 첫 번째 바이트와 일치시킵니다.

세 번째 바이트 (각 패스에 최대 4 개의 다른 바이트가 올 수 있지만 각 패스에 최대 4 개의 배열이 필요함)와 네 번째 바이트에 대해 다시 수행하면 누락 된 숫자가 모두 발견됩니다.

시간 복잡성- O(n * log n)
공간 복잡성- 일정 !

편집하다:

실제로, 나는 n=2^32매개 변수 라고 생각 했지만 누락 된 숫자의 수 k=4는 매개 변수입니다. k<<n이것이 공간 복잡성을 의미 한다고 가정하면O(k) .

최신 정보:

재미를 위해 (그리고 현재 Rust를 배우려고 노력하고 있기 때문에) Rust에서 구현했습니다 : https://gist.github.com/idanarye/90a925ebb2ea57de18f03f570f70ea1f . 나는 ~ 2 ^ 32 숫자로 그것을 실행할 것이기 때문에 텍스트 표현을하기로 선택했습니다 ...


모든 숫자를 메모리에 유지하려면 (여러 패스의 경우) 4 바이트 * 2 ^ 32 메모리가 필요합니다. 따라서 모든 I / O를 네 번 수행 할 가능성이 높습니다. 그러나 사용 된 다른 메모리는 매우 작기 때문에 큰 일입니다.
user949300

1
@ user949300이 솔루션은 모든 것을 한 번에 메모리에로드하는 대신 파일을 하나씩 읽습니다.
Richard Tingle

"대부분의 카운터는 2 ^ 24에 있어야하지만 1 ~ 4 개의 카운터는 더 낮은 값을 가져야합니다."– 잘못된 : 0이 될 수 있으며 모든 누락 된 값은 첫 번째 바이트를 공유합니다 (두 번째 및 세 번째도 가능). 다음 : 두 번째 패스에서 몇 개의 어레이를 생성합니까? 256, 1-4 배 256, 256 배 256? 그리고 세 번째와 네 번째 패스에서?
Bernhard Hiller

3
@BernhardHiller이 파일에는 32 비트 공간에 가능한 모든 숫자가 들어 있으며 4 개의 다른 숫자를 저장하십시오. 따라서 첫 번째 바이트 모두가 발생하며 그 중 1-4 개만 적중이 적습니다.
Lasse V. Karlsen

@ LasseV.Karlsen 감사합니다. 이제 알고리즘을 이해합니다.
Bernhard Hiller

6

이것이 Java 인 경우 BitSet을 사용할 수 있습니다. 글쎄, 그중 두 개는 32 비트 숫자를 모두 보유 할 수 없기 때문에. 골격 코드, 아마도 버그 :

BitSet bitsetForPositives = new Bitset(2^31);  // obviously not 2^31 but you get the idea
BitSet bitsetForNegatives = new Bitset(2^31);

for (int value: valuesTheyPassInSomehow) {
  if ((value & 0x80000000) == 0)
     bitsetForPositives.set(value );
  else
     bitsetForNegatives.set(value & ~0x80000000);
}

그런 다음 BitSet.nextClearBit()누가 빠진 사람을 찾는 데 사용하십시오 .

훨씬 나중에 추가 된 참고 사항 :

이 알고리즘을 사용하면 시간이 많이 걸리는 부분 을 병렬 로 실행하는 것이 매우 쉽습니다 . 원본 파일이 대략 네 부분으로 나뉘어져 있다고 가정 해 봅시다. 4 쌍의 BitSet을 할당합니다 (2GB, 여전히 관리 가능).

  1. 4 개의 스레드가 병렬로 각각 하나의 파일을 자체 비트 세트 쌍으로 처리합니다.
  2. 완료되면 단일 스레드 또는 비트 세트 (사소한 시간)로 돌아가서 nextClearBit를 네 번 (또한 사소한 시간) 호출하십시오.

I / O가 여전히 속도 제한 단계가 될 것으로 기대하지만 마술처럼 모든 숫자가 메모리에 있으면 실제로 속도를 높일 수 있습니다.


3
@ 이단 아이 레. 이 솔루션은 코드가 거의 필요 없으므로 코딩 오류가 적습니다. 나는 이것이 시간 O (n)라고 꽤 예쁘다. 또한 대용량 파일을 통한 다중 패스를 가정 / 필요하지 않으므로 다중 패스를 요구하는 알고리즘보다 적은 공간을 사용합니다. "Oh dear"의 의미를 자세히 설명하십시오.
user949300

2
Integer.MIN_VALUE올바르게 처리되지 않습니다 . 부호 비트를 수정하지 않고 부호 비트를 마스킹 할 수 있습니다.
코드 InChaos

1
이 순진한 접근 방식은 32 비트 시스템에서도 약간의 RAM 용량 인 비트 세트에 2 ^ 32 비트 = 4Gib = 512MiB가 필요합니다.
코드 InChaos

선택한 언어에 내장 비트 세트가 없으면 바이트 배열을 사용하여 에뮬레이션합니다. 예를 들어 C #의 경우 :bool GetBit(byte[] byteArray, uint index) { var byteIndex = index >> 3; var bitInByte = index & 7; return (byteArray[byteIndex] >> bitInByte) & 1 != 0; }
CodesInChaos

1
@JoulinRouge (및 JacquesB) 따라서 우리는 이것이 시간이 선형이며, 적당한 (1/2 Gig) RAM을 사용하며 I / O의 패스를 한 번만 받는다는 데 동의합니다. 나를 위해 작동합니다.
user949300

5

이 질문은 비트 배열 (true / false)을 사용하여 해결할 수 있습니다. 이것은 특정 숫자의 발견 여부를 보유하기 위해 배열의 색인을 사용하여 모든 숫자에 대한 답을 보유하는 가장 효율적인 구조 여야합니다.

기음#

var bArray = new BitArray(Int32.MaxValue);

//Assume the file has 1 number per line
using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
            var n = int32.Parse(s);
            bArray[n] = true;
        }
}

그런 다음 배열을 반복하고 여전히 거짓 인 값의 경우 파일에 없습니다.

파일을 작은 덩어리로 나눌 수는 있지만 Windows 7 (64 비트)을 실행하는 16.0GB 노트북에 전체 int32 최대 크기 배열 (2147483647)을 할당 할 수있었습니다.

64 비트를 실행하지 않더라도 더 작은 비트 배열을 할당 할 수 있습니다. 사용 가능한 환경 자원에 적합한 범위가 [0-64000] [64001-128000] 등인 작은 파일 세트를 작성하여 파일을 사전 처리합니다. 큰 파일을 살펴보고 각 숫자를 해당 세트 파일에 씁니다. 그런 다음 각 작은 파일을 처리하십시오. 사전 처리 단계로 인해 시간이 조금 더 걸리지 만 리소스가 제한되어 있으면 리소스 제한이 해결됩니다.


음수를 처리하지 않는 것 같습니다. (또는 입력이 가장 높은 비트 세트를 가진 부호없는 정수.) 비트 세트의 메모리는 대부분의 32 비트 시스템에서도 문제가되지 않습니다.
user949300

@ user949300-맞습니다. 배열이 모든 false 값으로 초기화되었을 때 메모리 소비가 크지 않았습니다. 음수에는 보조 BitArray가 필요합니다. 아마도 bArrayNegative = new BitArrary (Int32.MaxValue)입니다. 숫자를 읽으면 양수 또는 음수를 확인한 다음 적절한 비트 배열에 넣을 수 있습니다. 의견 주셔서 감사합니다.
Jon Raynor

2

이것은 면접 질문이므로 면접관에게 제약 조건에 대한 이해를 보여줄 것입니다. 그렇다면 "가능한 모든 숫자"는 무엇을 의미합니까? 모두가 짐작하는 것처럼 실제로 0 ... 2 <(32-1)입니까? 일반적인 32 비트 아키텍처는 32 비트 이상의 숫자로 작동 할 수 있습니다. 분명히 표현의 문제 일뿐입니다.

32 비트 시스템에서 해결해야합니까, 아니면 숫자 제한의 일부입니까? 예를 들어 일반적인 32 비트 시스템에서는 파일을 RAM에 한 번에로드 할 수 없습니다. 또한 32 비트 시스템은 파일 크기 제한으로 인해 모든 숫자가 포함 된 파일을 가질 수없는 경우가 종종 있습니다. "4를 제외한 모든 숫자"와 같이 영리한 인코딩이 없다면 문제는 사소하게 해결됩니다.

그러나 실제로 질문을 "몇 개를 제외한 모든 숫자가 0 ... 2 ^ (32-1) 인 파일을 제공하면 누락 된 숫자를 줘"라고 이해하려면 (그리고 이것이 큰 경우 !) 여러 가지 방법으로 해결할 수 있습니다.

사소하지만 실현 불가능 : 가능한 각 숫자에 대해 파일을 스캔하여 파일이 있는지 확인하십시오.

512MB의 RAM과 파일을 통한 단일 패스 : 파일에서 읽은 모든 번호 (= 해당 인덱스에서 비트 설정)를 표시 한 다음 RAM을 한 번 전달하고 누락 된 것을 확인합니다.


1
몇 가지 좋은 질문이지만 32 비트 시스템이 정수, 부동 소수점 또는 huzziwigs를 나타내는 지 여부는 32 비트의 2 ^ 32 값만 나타낼 수 있습니다. 질문이 "아, 그래, 우리는 128 비트 초장을 허용한다"라면, 질문에서 32 비트 아키텍처 "제약"은 의도적으로 오도의 소지가있다. 많은 사양이 오도의 소지가 있거나 글을 잘못 작성했기 때문에 여전히 면접관에게 물어보아야 할 큰 질문입니다. 실제 솔루션은 내 것과 같은 BitSet입니다.
user949300

@ user949300 예-면접관이 무엇을 찾고 있는지 아는 것은 불가능합니다. 그들이 고용 한 마지막 사람이 "생각하기 전에 스택 해킹"사람이라면, "아키텍처에 대해 전혀 몰랐다"또는 "최적화 게임을하는 사람"인 사람과 대답이 달라야합니다. :) 이전에 큰 비트 세트로 작업했지만 (Java는 아니지만) 자연스럽게 내 마음에 들어옵니다. 필요한 경우 더 적은 메모리 (버킷 팅)에도 채택 할 수 있습니다. 비트 세트는 또한 512MB의 RAM으로 선형 시간으로 위 주석에서 "정렬 문제"를 해결합니다.
Eiko

0

인터뷰에서 기억하기 쉽고 표현하기 쉬운 한 가지 접근법은 N 비트의 모든 숫자를 보면 각 비트가 해당 값의 정확히 절반에 설정되고 다른 절반에 설정되지 않는다는 사실을 사용하는 것입니다. .

파일의 모든 값을 반복하고 끝에 32 개의 값을 유지하면 해당 값보다 정확히 (2 ^ 32 / 2) 약간 작은 32 개의 값으로 끝납니다. 최대 값 (2 ^ 32 / 2)과 총계의 차이는 결 측값의 각 위치에 설정된 총 비트 수를 제공합니다.

일단 가지고 나면, 그 총계를 줄 수있는 4 가지 값의 모든 가능한 세트를 결정할 수 있습니다. 그런 다음 파일의 값을 다시 검토하여 해당 조합의 일부인 값을 확인할 수 있습니다. 하나를 찾으면 해당 값을 포함하는 조합이 가능성으로 제거됩니다. 가능한 조합이 하나만 남아 있으면 대답합니다.

예를 들어 니블을 사용하면 다음 값이 있습니다.

1010
0110
1111
0111
1101
1001
0100
0101
0001
1011
1100
1110

각 위치에 설정된 총 비트 수는 다음과 같습니다.

7867

8 (4 ^ 2 / 2)에서 그것들을 빼면 다음과 같습니다.

1021

이는 다음 가능한 4 가지 값 세트가 있음을 의미합니다.

1000
0000
0011
0010

1010
0001
0010
0000

(내가 놓친 경우 용서하십시오, 나는 단지 이것을 시각으로하고 있습니다)

그리고 원래 숫자를 다시 살펴보면 1010이 바로 첫 번째 세트가 답이라는 것을 의미합니다.


그러나 당신은 하나가 아닌 4 개의 숫자를 찾아야합니다
freedev

@freedev 당신이 맞습니다. 그것이하는 일입니다. 4 개의 숫자 세트는 4 개의 숫자입니다.
JimmyJames

흥미롭지 만, 당신은 광택이납니다 determine all the possible sets of 4 values that could give those totals. 나는 이것이 이것이 당신의 대답에서 누락 된 솔루션의 중요한 부분이라고 생각합니다. 또한 시간과 공간의 복잡성에 영향을 줄 수 있습니다.
Allon Guralnek

@AllonGuralnek 당신이 맞습니다. 나는 이것을 통해 약간의 시간을 보냈고 최악의 경우에 같은 숫자에 얼마나 많은 4 개의 숫자 세트가 더해질 지 과소 평가했다. 나는 이것이 구할 수있는 생각이라고 생각하지만 여기에 배치 한 것보다 조금 더 복잡합니다. 나중에 자세한 내용으로 업데이트하겠습니다. 의견을 보내 주셔서 감사합니다.
JimmyJames

0

파일을 숫자를 늘려 정렬한다고 가정합니다.

실제로 (2³²-4) 숫자가 포함되어 있는지 확인하십시오.
이제 파일이 완성 된 경우 (또는 4 개의 누락 된 숫자가 마지막 4 개의 숫자 인 경우) 파일의 위치 N에있는 단어를 읽으면 일치하는 값 N이 반환됩니다.

예상치 못한 첫 번째 숫자 X1을 찾으려면 위치 [0..2³²-4-1)에서 이분법 검색을 사용하십시오.
첫 번째 누락 된 숫자를 찾으면 [X1 .. (2³²-4-1)] 위치에서 이분법 검색을 다시 수행하여 두 번째 누락 된 X2를 찾으십시오. 이번에는 N 위치에서 단어를 읽으면 일치하는 값 N-1이 반환됩니다. 누락 된 숫자가 더 이상없는 경우 (하나의 누락 된 숫자를 전달한 이후)
나머지 두 숫자에 대해서도 마찬가지로 반복하십시오. 세 번째 반복에서 N 위치의 단어를 읽으면 N-2가 반환되고 네 번째 반복에서는 N-3이 반환됩니다.

경고 : 나는 이것을 테스트하지 않았습니다. 그러나 나는 그것이 작동해야한다고 생각합니다. :)

현실에서 나는 다른 답변에 동의합니다. 첫 번째 질문은 환경에 관한 것입니다. 우리는 RAM을 사용할 수 있습니까 (얼마나 많은가) 직접 액세스 저장 장치에있는 파일입니까, 이것은 원샷 작업 (최적화 필요 없음) 또는 중요한 작업 (각 사이클 수)입니까? 외부 정렬 유틸리티를 사용할 수 있습니까? 등
의 컨텍스트에 대한 허용 타협을 찾을 수 있습니다. 이것은 적어도 알고리즘을 찾기 전에 문제 분석을 시작한다는 것을 보여줍니다.


-2

모든 표준 질문과 마찬가지로 해결책은 인터뷰 전에 Google에 질문하는 것입니다.

이 질문과 변형에는 모든 숫자의 XORing과 관련된 매우 정확한 '정답'이 있습니다. 데이터베이스 또는 인덱스의 인덱스를 이해하고 있음을 보여줍니다. 따라서 '어쩌면 효과가 있지만 논문에 나와있는 내용은 없습니다'에 대한 영점은 imfriad입니다.

장점에는 몇 시간 동안 수정하면 천재처럼 보일 수있는 유한 한 질문이 있습니다. 당신이 당신의 머리에서 그것을 해결하는 척하는 것을 잊지 마십시오.

편집하다. Ahh 4에 대해서는 XOR과 다른 접근법이있는 것 같습니다.

http://books.google.com/books?id=415loiMd_c0C&lpg=PP1&dq=muthukrishnan%20data%20stream%20algorithms&hl=el&pg=PA1#v=onepage&q=muthukrishnan%20data%20stream%20algorithms&f=false

편집하다. Downvoters : 이것은 OP에 명시된 정확한 문제에 대한 출판 된 교재 O (n) 솔루션입니다.


1
특히이 링크 된 책은 스트림 처리 에 관한 것 입니다. 특히, 제약 내에서 스트림 처리. 그건 내가 확실히 말했다 것이다 는 달리 아주 사소한 때문에이, 영업 이익은 보았다 문제의 근원이라고 생각합니다. 특히, 당신은 실제로 질문에 대답하지 않았습니다. 이것을 "원래"또는 "의도 된"질문으로 확실하게 포지셔닝 하고 해결책을 설명 할 수 있다면 나로부터 +1을 얻게 될 것 입니다.
svidgen

1
이 답변 (인터뷰에서)은 당신이 책을 읽었 음을 보여줍니다. 당신의 기술이나 사고 과정에 대해서는 아무것도 없습니다. 그리고 인터뷰 전에 어떻게 " 모든 표준 질문을 구글 "합니까? 내가 놓친 "면접에서 물어 본 모든 질문"의 유한 목록이 있습니까?
user949300

1
@ewan 그것은 또한 좋은 후보자를 고용하는 어려움을 강조합니다! 만약 "좋은"사람들이 인터뷰 질문에 대해 잘 준비되어 있다면 ... 실제로 내 사업 문제를 해결할 수있는 사람을 고용하는 것이 어려워 집니까?
svidgen

1
@ewan 명확하게하기 위해, 나는의 재미를 만들고 있었다 나의 잘못된 문장 부호. ... 어쨌든, 나는 또한 하루 종일 많은 일자리 제안을 받았으며, 표준 질문과 대답에 대해 꽤 무지한 사람조차도 없었습니다. 그리고 지금, 채용 관리자로서, 나는 인용 된 답변을 원하지 않는다고 약속 할 수 있습니다 ... 그러나 일부 관리자에게는 다른 요구가있을 것이라는 점을 이해합니다.
svidgen

1
@Ewan 나는 또한 의도 한대로 나의 어조가 수신되지 않았다면 한 가지 더 분명히해야한다. 당신 링크 된 책의 문제가 "의도 된 질문"이라는 것을 실제로 주장하기 위해 답을 수정 해야한다 . 그리고 질문에 대답 하십시오! ... 당신은 의심 여지없이 나의 +1과 다른 많은 것들을 가지고 있을 것이며 , OP를 그렇게하도록 도와주는 것에 대한 만족도는 분명 합니다.
svidgen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.