무냐의 개발일지
[코딩테스트] 파이썬 열이름 변경, 이진수 더하는 함수 구하기 본문
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'는 이진수를 나타내는 접두사이며, 그 뒤에는 실제 이진수 표현이 따라온다.
이건 내가 그냥... 기본적으로 이진수 계산하는 원리를 몰랐던 듯. 그냥 십진법으로 바꾸는 것밖에 생각 못했다 ㅜ^ㅜ
자리수끼리 더해서 그 나머지를 역수로 취하면 된다는 접근을 이걸 하면서 알았다
'LeetCode 코딩테스트' 카테고리의 다른 글
2114. Maximum Number of Words Found in Sentences (0) | 2024.04.13 |
---|---|
1281. Subtract the Product and Sum of Digits of an Integer (0) | 2024.04.13 |
938. Range Sum of BST (0) | 2024.04.13 |
[코딩테스트] sqrt 씌우기 (** 쓰지 않고), Deci-Binary더하기 숫자, 배열 더하기 (0) | 2024.04.11 |
[코딩테스트] Queue 큐 _코딩테스트 (key, sorted) 키별로 사람 줄 세우기 문제 | List 정렬할 때 Key값 설정 & index함수 (0) | 2024.04.09 |