TIL bin, int

2023. 4. 25. 22:17TIL/2023.4월

2023.04.25 화

컨디션이 좋지않더니 몸살감기가 왔습니다, 허리가 왜 이렇게 아프지 했더니 좀 있으니 열이납니다, 빠르게 알고리즘 문제하나 풀고 오늘을 마무리해 봅시다.

 

문제

bin1, bin2에는 각각 이진수가 들어있습니다, result값으로 bin1과 bin2의 합을 이진수의 형태로 받기 위해서 어떻게 해야할까요?

bin1 = 10 bin2 = 11 result = 101

십진수로 변경하면 bin1 = 2 bin2 = 3 result= 5 입니다.

 

시도

1. 이진수 그대로 덧셈시켜봅시다.

->이진수라는 것을 인식하지 못함 정수의 합이 출력됩니다. result = 21

2. 이진수를 십진수로 변경하는 메서드를 찾았습니다, 또한 십진수를 이진수로 변경하는 메서드를 찾았습니다.

사용해 줍니다.

def solution(bin1, bin2):
    answer = 0
    ten_bin1 = int(bin1, 2)
    ten_bin2 = int(bin2, 2)
    answer = bin(ten_bin1 + ten_bin2)
    return answer

에러가 발생했습니다.

TypeError: int() can't convert non-string with explicit base

int메서드를 사용하기 위해서는 변수의 형태가 str 즉 문자형이여야 합니다.

bin1 = 10(x) => bin1 = "10" (O) 

2-1. 문자형태로 변경 후 출력했습니다.

->나와야 하는 결과가 아닙니다.

출력결과: 0b101, result = 101로 출력되어야 합니다. 불필요한 0b를 제거해줍니다.

def solution(bin1, bin2):
    answer = 0
    ten_bin1 = int(bin1, 2)
    ten_bin2 = int(bin2, 2)
    answer = bin(ten_bin1 + ten_bin2)[2:]
    return answer

 

+)

어떻게 int메서드는 들어오는 값이 이진수라는 것을 알았을까요?

    ten_bin1 = int(bin1, 2)
    ten_bin2 = int(bin2, 2)

뒤에 2가 수상합니다.

    ten_bin1 = int(bin1, 8)
    ten_bin2 = int(bin2, 8)

이렇게 변경하여 사용해봅시다.

8진수 10,11은 십진수에서 각각 8,9 입니다, 17의 8진수는 21입니다, 따라서 예상되는 결과의 값은 21입니다.

결과는 10001 이진수 값이 출력됩니다.

그렇다면 bin1, bin2가 8진수로 잘 인식되었고, 그 합이 10진수로 잘 변경되었는지 확인해봅시다.

def solution(bin1, bin2):
    answer = 0
    ten_bin1 = int(bin1, 8)
    ten_bin2 = int(bin2, 8)
    answer = ten_bin1 + ten_bin2
    # answer = bin(ten_bin1 + ten_bin2)[2:]
    return answer

결과값은 17이 나옵니다.

그렇다면 십진수 17을 8진수로 변경할 때 문제가 발생한 것으로 보입니다. 

여기서 나온 결과값이 10001이고 십진수 17을 이진수로 변경하면 그 값이 10001이라는 것을 알 수 있습니다.

 

따라서, bin은 십진수를 이진수로 만들어주는 메서드라는 것을 알 수 있습니다.십진수를 8진수로 바꿔주는 메서드를 찾아보았습니다, oct라는 메서드를 사용하면 된다고 합니다.

def solution(bin1, bin2):
    answer = 0
    ten_bin1 = int(bin1, 8)
    ten_bin2 = int(bin2, 8)
    answer = ten_bin1 + ten_bin2
    answer = oct(ten_bin1 + ten_bin2)[2:]
    return answer

결과가 21로 출력됩니다.

 

느낀점

TIL이 이상한데 생각이 드실 겁니다, 시도부분에서 bin을 십진수를 이진수로 바꾸는 메서드로 알고 사용한 것이 아닌가? 의문이 드실 겁니다, 문제를 만났을 때 정확히 메서드가 어떤 기능을 하고, 어떻게 사용되며, 어떤 식으로 동작하는지 모르고 사용해서 그렇습니다.

def solution(bin1, bin2):
    answer = 0
    ten_bin1 = int(bin1, 2)
    ten_bin2 = int(bin2, 2)
    answer = ten_bin1 + ten_bin2
    answer = bin(ten_bin1 + ten_bin2)[2:]
    return answer

int 뒤의 2라는 요소가 이진수를 표현한다는 것, bin이 십진수를 이진수로 변경해주는 기능을 하고 [2:]는 split를 사용했다라는 것을 이해하지 못했습니다.

split의 기능도 사용방법도 인지하고 있었습니다, 하지만 문제를 만나고 메서드를 검색했을 때, bin [2:] 여기서 [2:]를 이진수로 바꾸기 위해 적어준다 라고 생각했습니다.

 

왜 이런 문제가 발생했을까요?

많은 메서드가 있고 필요할 때 찾아보면 된다 생각하고, 메서드의 기능을 좀 더 집중하여 살펴보지 않았기 때문이라 생각합니다.

구글링하여 답을 찾은 블로그에 제가 오늘 적은 TIL 시도 부분처럼 왜 사용하는지 친절히 예제 문제까지 하여 다 나와있었습니다, 저는 그것은 다 보지않고 이렇게 코드를 사용하면 문제를 풀 수 있구나만 생각하였기에 왜 int를 사용하고 bin을 사용하며 split [2:]를 사용해야 하는지 몰랐던 것입니다.

 

sort, sorted 알고리즘 문제를 풀면서 많이 사용했습니다, 막연히 정렬을 위해 사용하지 정도만 알고있다, 오늘 페어프로그램을 하면서 sort는 기존 리스트를 재정의하고, sorted는 새로운 리스트를 만들고 그 곳에 정렬을 시도한다는 것을 알았습니다, 또한 정렬을 위해 sort, sorted를 사용하는 것은 알아도 코드로 표현하는 부분에서 형태가 올바르지 않다는 에러를 항상 마주합니다, 또한 += 과 append 의 차이와 사용 방법 등도 이와 같다 볼 수 있습니다.

 

알고리즘 문제를 풀면서 사용하는 메서드의 기능과 작동원리에 대하여 조금 더 생각해보아야겠다 오늘 생각했습니다.

'TIL > 2023.4월' 카테고리의 다른 글

TIL django image field  (1) 2023.04.27
TIL 알고리즘[로그인 확인]  (0) 2023.04.26
TIL onclick ()  (0) 2023.04.24
TIL CORS  (0) 2023.04.21
TIL CBV(클래스형 뷰), swagger  (0) 2023.04.20