[비트조작] Leet code 393. UTF-8 Validation

su_y2on·2022년 1월 20일
0

알고리즘

목록 보기
13/47
post-thumbnail

리트코드 393번
UTF-8검증하기

시도1

class Solution:
    def validUtf8(self, data) -> bool:

        first = bin(data[0])[2:].zfill(8)
        count = 0
        print(first)
        # 몇글자 문자인지 구하기
        for bit in first:
            if bit == "0":
                break
            count += 1


        if count == 0:
            return True
        if count == 1:
            return False

        # 문자길이 짧은 경우
        if len(data) < count:
            return False

        for num in data[1:count]:
            print(bin(num)[2:].zfill(8)[:2])
            if bin(num)[2:].zfill(8)[:2] !="10":
                return False

        return True
  • 먼저 문제에 1-4byte의 문자만 온다고 되어있습니다....ㅠㅠ
  • 열심히 테케 틀려가며 최대한 작성해본 코드인데.. 사실 더이상 어디가 틀린지도 모르겠어서ㅠㅠ 일단 UTF라는 개념이 설명만으로 살짝 부족했다고 느꼈습니다. 예를 들면 N바이트 문자면 뒤에 N-1개의 바이트가 10으로 시작해야하는데 만약 N-1개 이상이 10으로 시작하는거면 맞는다고 해야할지 틀리다고 해야할지 몰랐습니다..
  • 그래서 다 틀려보면서 정말 설명나온 기준만큼만 만족하면 되고 기준에서만 어긋나면 틀리는 거라는 것을 알았습니다..
  • 하지만 문제는 연달아서 체크를 해줘야하는지를 파악을 못해서 나는 한번만 체크를 한것..



풀이1

class Solution:
    def validUtf8(self, data) -> bool:
        start = 0

        def check(size):
            for i in range(start + 1, start + size + 1):
                if i >= len(data) or (data[i] >> 6 != 0b10): # size만큼 있어야하고 앞에 10이어야함
                    return False
            return True

        while start < len(data):
            first = data[start]

            if (first >> 3) == 0b11110 and check(3):
                start += 4
            elif (first >> 4) == 0b1110 and check(2):
                start += 3
            elif (first >> 5) == 0b110 and check(1):
                start += 2
            elif (first >> 7) == 0b0:
                start += 1
            else: # check가 false거나 1-4바이트 해당안되는 문자들
                return False

        return True
  • 일단 시도와의 차이점은 나는 몇번째로 0이나오는지를 for문으로 찾았지만 shift 연산자를 이용해서 뭔가 깔끔하게 풀이
  • first >> n 한 것과 그냥 2진수 표현을 그대로 비교해도 되는지 몰라서 나는 문자열로 바꾸고 그랬는데... 이게 되는거였구나🥲 비트는 너무 어려워....
  • 그리고 start라는 변수를 둬서 여러 문자들을 점검할 수 있게 해줬습니다
  • check에서 중요하고 놓치기 쉬운것은 바로 i > =len(data)인데 이게 처음에는 잘 몰랐지만 테케중에 뒤에n-1개 바이트가 10로 시작하는지 확인해야하는데 뒤에 n-1개 보다 적은 경우도 있어서 꼭 체크해줘야합니다. 안그러면 인덱스 범위초과되버림

0개의 댓글