CodeKata4주차

김경천·2021년 6월 20일
0

1차 프로젝트준비하느라 시간이없던겄도 있지만 어려워서 못푼 문제들이 많아서 정리를해볼생각이다.

day1

양수 N을 이진법으로 바꿨을 때, 연속으로 이어지는 0의 갯수가 가장 큰 값을 return해 주세요.

  • 이어지는 0은 1과 1사이에 있는 것을 의미합니다.
  • 이런 것을 binary gap 이라고 합니다.

예시

input: 20
output: 1
설명: 20의 이진수는 10100 입니다. 
11사이에 있는 연속된 0의 수는 1 뿐입니다.
(뒤에 있는 01사이에 있는 것이 아니므로)
input: 529
output: 4
설명: 529의 이진수는 1000010001 입니다. 
11사이에 있는 연속된 0의 수는 43입니다.
이 중 큰 값은 4이므로 4return

solution

def solution(N):
  binary = format(N, 'b')
  max = 0
  binarylist = binary.strip('0').split('1')
  
  for x in binarylist:
    if not x:
      continue
    if len(x) > max:
      max = len(x)
      
  return max
solution(9)

format를 사용하여 이진수로 변경하였고
strip를 사용하여 앞뒤에 0이 존재하면 지웠다.(10100 같은경우는 101만 남게된다)
split을 사용하여 1을 기준으로 나눴다.(101001같은경우 ["","0","","00",""]이런식으로 된다)
반복문을 사용하여 리스트를 돌개하였고 길이를 비교하여 더큰 값을 저장하는식으로하여 max값을 리턴하였다.

day2

prices는 배열이며, 각 요소는 매일의 주식 가격입니다.
만약 한 번만 거래할 수 있다면 = 사고 팔 수 있다면, 제일 큰 이익은 얼마일까요?

예를 들어,

Input: [7,1,5,3,6,4]
Output: 5

설명: 2일(가격=1)에 샀다가 5일(가격=6)에 사는 것이 6-1이라 제일 큰 수익
7-1=6 은 안 되는거 아시죠? 먼저 사야 팔 수 있습니다.

Input: [7,6,4,3,1]
Output: 0

설명: 여기서는 매일 가격이 낮아지기 때문에 거래가 없습니다. 그래서 0

solution

def maxProfit(prices): 
  min_index  = prices.index(min(prices))
  max_index = prices.index(max(prices[min_index:]))
  
  if min_index == max_index:
    return 0
  else:
    return prices[max_index] - prices[min_index]

최소값의 index를 구하고 그 index의 오른쪽에 최댓값이 있어야 하므로(먼저 사야 팔 수 있으므로) 슬라이싱을 사용해서 가장 작은 수의 오른쪽에서 최댓값을 찾는다. 만약 오른쪽에 더이상 최소값보다 큰 값이 없다면 최댓값은 이미 구한 최솟값과 같을 것이므로 min_index와 max_index가 같다면 0을 return한다.

day3

다음과 같이 input이 주어졌을 때,
같은 알파벳으로 이루어진 단어끼리 묶어주세요.

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

output에서 순서는 상관없습니다.

solution

day4

숫자로 이루어진 리스트 nums를 인자로 주면,
그 안에서 어떤 연속적인 요소를 더했을 때 가장 큰 값이 나오나요?
가장 큰 값을 찾아 return해주세요.

Input: [-2,1,-3,4,-1,2,1,-5,4]
Output: 6

설명: [4,-1,2,1] 를 더하면 6이 가장 크기 때문

solution

def maxSubArray(nums):
  for i in range(1, len(nums)):
    if nums[i-1] > 0:
      nums[i] += nums[i-1]
      
  print(nums)
  return max(nums)

만약 [-2, 1, -3, 4, -1, 2, 1, -5, 4]면 for문을 돌린 후에는 [-2, 1, -2, 4, 3, 5, 6, 1, 5]로 바뀐다. 각 요소가 합으로 대체되므로 합이 계속 기록되고 그 중 가장 최댓값을 찾으면 된다.

참고
참고

profile
화이팅

0개의 댓글