ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION125 / 1500
알고리즘난이도 중하5분 답변 목표 · 보강본

질문 목록을 매번 중복 없이 무작위로 보여 주려 합니다. Fisher–Yates 셔플과 매번 독립 추첨은 무엇이 다른가요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

Fisher–Yates는 배열의 뒤쪽부터 남은 범위에서 균등한 위치를 골라 교환해 전체 순열을 만드는 방법입니다. 그 덱에서 하나씩 꺼내면 한 주기 안 중복이 없지만 각 클릭을 독립 추첨하는 분포와는 다릅니다.

동작 원리와 전제

i번째 위치와 0..i 사이에서 고른 위치를 교환하고 i를 줄입니다. 매 단계 범위가 정확하고 난수가 균등하면 각 순열이 같은 확률을 가집니다. sort comparator에 무작위 값을 반환하는 방식은 비교 규칙을 깨고 편향된 결과를 만들 수 있습니다.

선택과 실패 처리

현재 질문은 덱에서 제거하고 한 바퀴가 끝나면 새로 섞어 직전 질문의 즉시 반복을 피할 수 있습니다. 새 문항 추가·삭제·새로고침의 남은 덱 상태를 관리합니다. 주제 다양성을 강제로 높이면 전체 균등 순열과는 다른 정책이므로 명시합니다.

구체적인 사례와 검증

배열 길이가 4일 때 마지막 위치는 4개 후보, 그 앞은 남은 3개, 다음은 2개 중 선택하므로 균등한 선택이면 4! 순열이 같은 확률을 가집니다. 매번 전체 범위에서 아무 두 원소를 교환하는 방식은 같은 증명을 갖지 않습니다. 덱 상태를 저장하면 새로고침 후에도 이미 본 질문을 피할 수 있지만 새 탭·저장소 차단·데이터 삭제의 정책을 명시해야 합니다. 문항이 추가되면 새 ID를 남은 덱에 넣고 삭제된 ID는 제거합니다. 한 주기 안 같은 질문이 없다는 검증과 주기마다 순서가 새로 섞이는 검증을 나눠 수행합니다.

고정 난수로 교환 경계·전체 항목 한 번 등장·빈 배열·한 항목·주기 전환을 시험합니다. 여러 독립 세션의 순서가 달라지는지 보고, 통계적 무작위성과 사용자가 느끼는 반복 감소를 구분합니다. 학습 UX에는 의도적인 비복원 추출이 더 적합할 수 있습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: Fisher–Yates는 배열의 뒤쪽부터 남은 범위에서 균등한 위치를 골라 교환해 전체 순열을 만드는 방법입니다.
  • 선택 조건: 현재 질문은 덱에서 제거하고 한 바퀴가 끝나면 새로 섞어 직전 질문의 즉시 반복을 피할 수 있습니다.
  • 검증 기준: 고정 난수로 교환 경계·전체 항목 한 번 등장·빈 배열·한 항목·주기 전환을 시험합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 무작위 sort comparator가 균등한 셔플과 같은 결과를 보장한다고 한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 원천 난수 범위가 후보 수로 나누어떨어지지 않으면 어떤 값을 거절해야 균등해지나요?
  • 길이를 모르는 입력에서 K개만 보관하며 균등 포함 확률을 어떻게 유지하나요?
  • 실행 간 순서가 달라질 때 언어의 hash와 외부 결정적 정렬을 어떻게 구분하나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기