North Korean dictionary order
JavaScript (ES6), 150 148 137 bytes
Saved 10 bytes thanks to @Grimy
I/O: arrays of characters.
a=>a.map(c=>"ANBCODEFPGQSHRIJKLM"[(n=c.charCodeAt()-44032)/588|0]+"AKBLCMDNERTOFGSUPHIQJ"[n/28%21|0]+~(n%28%18==2)+c).sort().map(s=>s[4])
Try it online!
Splitting Hangul syllables
Given a Hangul character of code point 0xAC00 + \$n\$, the initial consonant \$I\$, vowel \$V\$ and final consonant \$F\$ are given by:
$$I=\left\lfloor\frac{n}{588}\right\rfloor,\ V=\left\lfloor\frac{n}{28}\right\rfloor\bmod 21,\ F=n\bmod 28$$
Commented
a => a.map(c => // for each character c in the input:
"ANBCODEFPGQSHRIJKLM"[ // start with a letter from 'A' to 'S'
(n = c.charCodeAt() - 44032) // for the initial consonant
/ 588 | 0 //
] + //
"AKBLCMDNERTOFGSUPHIQJ"[ // append a letter from 'A' to 'U'
n / 28 % 21 | 0 // for the vowel
] + //
~( // append "-2" for ㄲ or ㅆ (the only North
n % 28 % 18 == 2 // Korean final consonants that are sorted
) + // differently) or "-1" otherwise
c // append the original character
) // end of map()
.sort() // sort in lexicographical order
.map(s => s[4]) // isolate the original characters