무냐의 개발일지

[코딩테스트] 파이썬 열이름 변경, 이진수 더하는 함수 구하기 본문

LeetCode 코딩테스트

[코딩테스트] 파이썬 열이름 변경, 이진수 더하는 함수 구하기

무냐코드 2024. 4. 10. 18:22

df.rename(columns = {"level_0": "Feature 1", "level_1": "Feature 2", 0: 'Correlation Coefficient'}, inplace=True)

 

import pandas as pd

def renameColumns(students: pd.DataFrame) -> pd.DataFrame:
    students.rename(columns={'id' : 'student_id',
    'first' : 'first_name',
    'last' : 'last_name',
    'age' : 'age_in_years'},inplace = True)
    return students

 

 


1. Two Sum 

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if (i != j) and (target == (nums[i] + nums[j])):
                        return [i, j]
        return []

 

풀이

for loop를 두 개 넣어서, [i, j] 구한다

여기서 주의할 점은 i 랑 j가 같으면 안되므로, j의 Range(i+1, n) 으로 넣어준다!!

 

 

 

67. Add Binary

Given two binary strings a and b, return their sum as a binary string.

Example 1:
Input: a = "11", b = "1"
Output: "100"

 

Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
 
Constraints:
1 <= a.length, b.length <= 104
a and b consist only of '0' or '1' characters.
Each string does not contain leading zeros except for the zero itself.

 

풀이

십진수 -> 이진수 구하는 방법

2로 나누고 몫, 나머지를 따로 저장한다

몫이 0이 될 때까지 반복하고, 나머지를 역순으로 구하면 그게 이진수다

 

1. 몫, 나머지를 담는 별도의 상자가 각각 필요하겠다

2. 두 이진수를 더해서, 다른 이진수를 구하는 거니까,

 

- 나머지 계산 (Remainder Calculation):  % 연산자
 -몫 계산 (Quotient Calculation):  // 연산자

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        s = []  #나머지를 담는 곳 : 이걸 나중에 뒤집으면 구하려는 이진수가 나옴
        carry = 0  #몫을 담는 곳 : 여기 있는 걸 계속 2로 나눈다
        i = len(a)-1  #111 이면 3 , range(i) = 0,1,2
        j = len(b)-1   

        while i>=0 or j>=0 or carry:    #최종적으로 몫이 0이 될때까지 --- carry가 0 이어도 계속된다
            if i>=0 :
                carry += int(a[i])  #a=111 이라고 하면, i=2, a[i]=1 
                i -= 1              #a[2], a[1], a[0] 까지 작아지게 된다 
            if j>=0 :
                carry += int(b[j])
                j -= 1               #각각의 자리수를 더해주는거다. 10진수로 바꿔주지도 않고.
            s.append(str(carry%2)) #나머지들만 쭉 담는다 - 여기까지의 과정을 반복 
            carry //= 2 
        return ''.join(reversed(s))

 

1010

1011

이렇게 두 개 이진수가 있다고 하면, 그냥 각 끝자리수부터 시작해서 같은 자리수끼리 더해준 애들을 그 때 그 때 리스트 s에 넣어주는거다

 

carry(몫) = 0

s(나머지) = [ ]

1) 4번째 자리수  0+1+0 = 1

   s = [1], carry = 0

2) 3번째 자리수 = 0+1+1 = 2

   s = [0], carry = 1

3) 3번째 자리수 = 1+0+0 = 1

   s = [1], carry = 0

4) 1번째 자리수 = 0+1+1 = 2

   s = [0], carry = 1

5) 마지막 carry 몫을 0으로 해줘야되니까

   s = [1], carry = 0

 

최종적으로 s = [1,0,1,0,1] 이 되고, 이걸 순서를 반대로 해줘야 되니까, reversed(s) = [1,0,1,0,1]

그거를 join 해주면  return ''.join(reversed(s)) = 10101 이 표출된다 !! 

 

 

 

근데, 이렇게 어렵게 풀 필요 없이, 그냥 이진수, 십진수 변환 함수를 쓰면 된다

 

int(a, b) : b진법으로 되어있는 문자열a 를 10진수로 변환하는 함수

 

int의 또 다른 활용법이다!!  1010을 십진법으로 바꾸고 싶으면 int('1010', 2) 라고 하면 됨. 그러면 '1010'을 2진수로 해석해서, 10진법으로 바꿔주는거다. (처음 알았네)

 

그래서 훨씬 쉬운 접근은 !!

 

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        sum_ab = int(a,2) + int(b,2)
        return bin(sum_ab)[2:]

#[2:] 를 해주는 이유는, 그냥 출력시 앞에 0b라는 접수사가 나온다
#여기서 '0b'는 이진수를 나타내는 접두사이며, 그 뒤에는 실제 이진수 표현이 따라온다.

 

 

이건 내가 그냥... 기본적으로 이진수 계산하는 원리를 몰랐던 듯. 그냥 십진법으로 바꾸는 것밖에 생각 못했다 ㅜ^ㅜ 

자리수끼리 더해서 그 나머지를 역수로 취하면 된다는 접근을 이걸 하면서 알았다