하나의 값이 두 용도
Lua의 핵심 자료구조는 테이블 하나입니다.
local t = {10, 20, 30} -- 배열부 (1부터)
t.name = "x" -- 해시부
t["k"] = true
인덱스는 1부터입니다. 0을 쓰면 해시 키로 들어가 #t·ipairs에 안 잡힐 수 있습니다.
길이 연산자
#t는 배열부 길이 감각입니다. 구멍이 있으면(nil이 중간에 있으면) 길이 정의가 애매해집니다.
연속된 1..n만 쓰는 편이 안전합니다.
ipairs vs pairs
for i, v in ipairs(t) do
-- 1,2,3... 순서 보장 (배열부)
end
for k, v in pairs(t) do
-- 키 순서 비보장 (해시 포함)
end
정렬·인덱스가 필요하면 ipairs 또는 숫자 키를 모아 정렬하세요.
집합·빈도
local seen = {}
seen[x] = true
local freq = {}
freq[x] = (freq[x] or 0) + 1
nil을 값으로 넣으면 키가 지워집니다. “없음”과 “값 nil”을 구분해야 하면 센티널을 쓰세요.
연습
문자열을 공백으로 나눠 중복을 제거한 뒤 정렬해 이어 붙이는 solve를 만들어 보세요 (lua-unique 계열).
삽입·삭제
table.insert(t, value) -- 끝에 추가
table.insert(t, i, value) -- i 위치에
local v = table.remove(t) -- 끝에서 제거
중간 삽입은 O(n)입니다. 빈번하면 다른 구조를 고려하세요.
정렬
table.sort(t) -- 기본: 오름차순 (비교 가능해야 함)
table.sort(t, function(a, b) return a > b end)
nil이 배열부 중간에 있으면 정렬·길이가 깨집니다.
한 줄
> 숫자 키 1..n은 배열부, 그 외는 해시부. 순회 함수를 맞게 고른다.