30문항 뒤의 데이터 구조

SBTI 테스트 화면은 단순하다 — 30문항, 각 3지선다, 쭉쭉 누르면 끝. 하지만 "다음" 버튼을 누르는 그 몇 초 동안 백엔드에서는 네 심리 모델이 조립되고 있다.

핵심 구조부터 알아야 한다. 30문항은 랜덤 배열이 아니다. 15개 심리 차원에 정확히 2문항씩 배정돼 있다. 차원 번호는 S1부터 So3까지, 자아(S1-S3), 감정(E1-E3), 태도(A1-A3), 행동(Ac1-Ac3), 사교(So1-So3) 순서다. 1~2번 문항은 S1(자존감/자신감), 3~4번은 S2(자아 명확도), 5~6번은 S3(핵심 가치), 이런 식으로 쭉 이어진다.

각 문항의 세 선택지는 1점, 2점, 3점에 대응한다. 여기서 간과하기 쉬운 디테일: 모든 문항의 선택지가 순방향은 아니다. 일부 문항은 점수가 역순으로 배치돼 있다 — 첫 번째 선택지가 3점이고 세 번째가 1점. "전부 1번" 같은 기계적 응답으로 결과를 조작하는 걸 방지하는 장치다.

30문항을 다 풀면 시스템 손에 30개 점수가 쥐어진다. 이것을 차원별로 합산한다 — 각 차원의 2문항 점수를 더해서 원시 점수를 만든다. 문항당 1~3점이니까 2문항 합산 범위는 2점에서 6점. 이 15개 원시 점수가 테스트 결과 전체의 기초 데이터다.


점수에서 등급으로: 세 칸 분류

원시 점수를 받은 다음 단계는 등급 분류다. 로직이 놀라울 정도로 단순하다:

  • 2~3점 → L(Low, 낮음)
  • 4점 → M(Medium, 중간)
  • 5~6점 → H(High, 높음)

분포를 보자. L은 2점과 3점 두 값을 포함하고, H는 5점과 6점 두 값을 포함하지만, M은 4점 딱 하나만 해당된다. 두 문항 합산이 정확히 4점(1+3, 2+2 조합)이어야 M이 나오므로, 통계적으로 M이 나올 확률이 가장 낮다.

이 설계가 흥미롭다. SBTI는 의도적으로 "중간 함정"을 피한다 — 대다수를 무난한 중간지대에 몰아넣지 않고 양쪽으로 밀어낸다. 결과적으로 최종 인격 프로필이 더 뚜렷하고 "개성" 있게 나온다 — 캡처해서 SNS에 올리기에도 좋다.

예시. S1(자존감/자신감)에서 두 문항에 각각 2점, 3점을 골랐다면 합산 5점, H 등급. E2(감정 투자도)에서 1점, 2점을 골랐다면 합산 3점, L 등급. 15개 차원을 다 분류하면 15자리 알파벳 문자열이 만들어진다. 5개 모델별로 하이픈을 넣어 표기하면 HMH-LML-HHM-LMH-HML 같은 형태다. 이 문자열이 네 "인격 DNA" — SBTI 모든 후속 계산의 입력값이다.


패턴 매칭: 네 DNA와 25종 표준 유형 대조

인격 DNA가 나오면 시스템이 할 일은 하나다: 25종 일반 유형의 표준 DNA와 하나씩 비교해서 가장 닮은 걸 찾는다.

각 일반 유형에는 미리 정의된 15자리 패턴 문자열이 있다. 예를 들어 CTRL(장악자)의 표준 패턴은 HHH-HMH-MHH-HHH-MHM, DEAD(사망자)는 LLL-LLM-LML-LLL-LHM. 직관적으로 봐도 차이가 보인다 — CTRL은 거의 전부 H, DEAD는 거의 전부 L.

비교에는 맨해튼 거리(Manhattan Distance)를 쓴다. 먼저 L=1, M=2, H=3으로 수치 변환한다. 그다음 네 15차원 수열과 표준 유형의 15차원 수열을 자리별로 빼서 절대값을 구하고 전부 합산한다.

구체적 예시. 네 패턴이 HHL-MHH-MLH-HHM-HLH이라면 수열은 3,3,1-2,3,3-2,1,3-3,3,2-3,1,3. CTRL 표준 패턴 HHH-HMH-MHH-HHH-MHM(수열 3,3,3-3,2,3-2,3,3-3,3,3-2,3,2)과 비교:

자리별 차이: |3-3|=0, |3-3|=0, |1-3|=2, |2-3|=1, |3-2|=1, |3-3|=0, |2-2|=0, |1-3|=2, |3-3|=0, |3-3|=0, |3-3|=0, |2-3|=1, |3-2|=1, |1-3|=2, |3-2|=1

총 거리 = 0+0+2+1+1+0+0+2+0+0+0+1+1+2+1 = 11

유사도로 변환: max(0, round((1 - 11/30) × 100))% = 63%. 거리가 작을수록 유사도가 높다. 이론상 최대 거리가 30(15차원 × 최대 차이 2)이므로 30으로 나눠 정규화한다.


순위 결정, 폴백, 그리고 그 한 잔의 술

25종 일반 유형 전부에 대해 위 계산을 마치면, 거리가 작은 순으로 정렬한다 — 거리가 가장 작은 유형이 최적 매칭이다. 거리가 동점이면 "정확 일치 차원 수"(완전히 같은 차원이 몇 개인지)를 추가 비교해서 많은 쪽이 앞선다.

결과를 확정하기 전에 두 개의 게이트가 있다:

첫 번째 게이트는 유사도 임계값이다. 최적 매칭의 유사도가 60% 미만이면 — 가장 닮은 유형과도 60%밖에 안 닮았다면 — 시스템이 "기존 틀에 안 맞음"으로 판정하고 HHHH(웃음보)를 부여한다. 어떤 응답 패턴이든 반드시 결과가 나오도록 보장하는 엔지니어링 폴백이다.

두 번째 게이트는 시간 순서상 더 먼저다: DRUNK 체크. 30문항을 다 풀고 나면 음주 관련 보충 문항이 나온다. 여기서 "술꾼 경로"를 타면 — 4지선다 게이트 문항을 통과하고, 2지선다 확인 문항까지 통과하면 — 시스템은 위의 패턴 매칭 과정을 전부 건너뛰고 바로 DRUNK를 부여한다. 앞에서 열심히 답한 30문항? 전부 휴지통행이다. SBTI가 원래 "친구 술 끊기 프로젝트"에서 시작됐다는 걸 기억하자 — DRUNK는 그 초심의 잔재다.

전체 결과 판정 흐름: DRUNK 체크 → 미발동 시 패턴 매칭 → 최적 매칭 ≥ 60%면 채택 → 60% 미만이면 HHHH. 코드 몇십 줄로 수천만 명의 인격 라벨을 만들어냈다.


결과 인코딩: 16자리 숫자의 공유 암호

테스트 결과가 나온 뒤 마지막 단계: 공유 가능한 형식으로 인코딩한다.

SBTI 공유 링크 안에는 16자리 순수 숫자 문자열이 숨어 있다. 앞 15자리는 15개 차원의 원시 점수(차원당 한 자리, 범위 2~6), 마지막 1자리는 DRUNK 플래그(0 또는 1). 예를 들어 5342364553423420이면: S1=5, S2=3, S3=4, E1=2, E2=3, E3=6, A1=4, A2=5, A3=5, Ac1=3, Ac2=4, Ac3=2, So1=3, So2=4, So3=2, DRUNK=0.

이 인코딩이 공유 링크의 ?result= 파라미터에 들어간다. 친구가 링크를 열면 시스템이 16자리에서 전체 차원 점수와 매칭 결과를 복원한다 — 다시 문항을 풀지 않아도 네 결과를 볼 수 있다. SBTI 공유 링크가 매끄러운 이유가 이거다: 열면 바로 보이고, 보고 나서 바로 커플 매칭으로 넘어갈 수 있다.

이 인코딩 방식은 한 가지를 의미한다: 공유 링크에 15개 차원의 원시 점수가 전부 들어 있다. 기술을 아는 사람은 링크만 보고 전체 심리 프로필을 읽어낼 수 있고, 수동으로 다른 유형과의 매칭률도 계산할 수 있다. 이 16자리 숫자는 유형 이름보다 더 많은 정보를 담고 있다 — 완전한 심리 스냅샷이 눈에 띄지 않는 숫자열로 압축된 셈이다.


알고리즘을 아는 게 왜 중요한가

"알고리즘 디테일 알아서 뭐 해? 그냥 유형 나오면 캡처해서 올리면 되는 거 아님?"

알고리즘을 아는 건 테스트를 "잘 치기" 위해서가 아니라, 결과의 의미와 한계를 정확히 이해하기 위해서다.

차원당 2문항이라는 걸 알면, 재검사 결과가 왜 바뀌는지 이해된다 — 한 문항에서 선택지 하나만 바꿔도 차원 등급이 H에서 M, 심지어 L로 바뀔 수 있고, 전체 매칭 결과가 뒤집힌다. 맨해튼 거리 계산 방식을 알면, "73% 매칭"과 "95% 매칭"의 차이가 얼마나 큰지 실감한다 — 전자는 15차원 중 여러 개가 표준 패턴과 다르고, 후자는 거의 완벽한 일치다.

HHHH의 60% 임계값을 알면, 이 유형이 왜 그렇게 희귀한지도 납득된다 — 25종 표준 패턴이 이미 차원 조합 공간의 대부분을 커버하고 있어서, 모든 유형의 사각지대에 떨어지려면 정말 "비표준"이어야 한다.

SBTI 알고리즘은 복잡하지 않지만 충분히 우아하다. 최소한의 데이터(30번의 선택)로 15차원 심리 프로필을 구축하고, 가장 단순한 거리 계산으로 그것을 밈이 되고 캡처가 되는 라벨에 매칭한다. 입력에서 출력까지 전체 시스템이 "공유할 거리를 만들어 주는 것" 하나를 향해 설계돼 있다.