😎풀이

  1. 첫 문자를 통해 N바이트의 문자인지 판별
    1-1. 이 때, UTF-8 특성상 1 ~ 4 바이트만 가능
    1-2. 1 바이트는 00, 4바이트는 11110으로 시작하기 때문에, 1로 시작하는 비트가 1개이거나, 4개를 초과한다면 UTF-8형식 위반
  2. 후속 비트는 10으로 시작해야하며, 그러한 바이트가 N-1개 있어야 함
  3. 올바른 UTF-8 형식 여부를 판별하여 반환
function validUtf8(data: number[]): boolean {
    let tailer = 0

    for (const num of data) {
        const binary = num.toString(2).padStart(8, '0')
        if (tailer === 0) {
            let startOne = 0
            for (const bit of binary) {
                if (bit === '1') startOne++
                else break
            }

            if (startOne === 0) continue
            if (startOne === 1 || startOne > 4) return false

            tailer = startOne - 1
        } else {
            if (binary.startsWith('10')) {
                tailer--
            } else {
                return false
            }
        }
    }

    return tailer === 0
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글