TIL | 3주차 1) CodeKata

문제 1


def two_sum(nums, target):
    # 아래 코드를 작성해주세요.

1. 내가 푼 방법 (난잡함)

from itertools import permutations

def two_sum(nums, target):
    # 아래 코드를 작성해주세요.

    list_1 = list(permutations(nums, 2))
    list_2 =[]

    for i in list_1:
      if i[0] + i[1] == target:
        a = nums.index(i[0])
        b = nums.index(i[1])
        list_2.append(a)
        list_2.append(b)
        return list_2
        break
      else:
        continue  

2. 기용님한테 배운 방법 (깔끔함)

def two_sum(nums, target):
    # 아래 코드를 작성해주세요.

    for i_idx , i_val in enumerate(nums) :
      for j_idx, j_val in enumerate(nums) :
        if i_val + j_val == target :
          return [i_idx, j_idx]

새로 알게 된 개념 : enumerate

  • enumerate : 열거하다
  • 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴
  • 리턴값은 다 tuple형태
t = [1, 5, 7, 33, 39, 52]
for p in enumerate(t):
  print(p)
# (0, 1)
# (1, 5)
# (2, 7)
# (3, 33)
# (4, 39)
# (5, 52)


str = "enumerate"
for i in enumerate(str):
  print(i)
# (0, 'e')
# (1, 'n')
# (2, 'u')
# (3, 'm')
# (4, 'e')
# (5, 'r')
# (6, 'a')
# (7, 't')
# (8, 'e')


obj = {'이름':'김민호', '나이':'30'}
for j in enumerate(obj):
  print(j)
# (0, '이름')
# (1, '나이')


obj1 = {'이름':'김민호', '나이':'30'}
for k in enumerate(obj1.items()):
  print(k)
# (0, ('이름', '김민호'))
# (1, ('나이', '30'))

문제 2

1시간정도 삽질하다가 결국 못 품 ㅎ ㅎ

def reverse(number):
  # 여기에 코드를 작성해주세요.
  if number > 0:
    str_n = str(number)[::-1]
    return int(str_n)

  elif number < 0:
    str_n1 = str(number)[1:] 
    return int(str_n1[::-1]) * -1
    
  else:
    return 0  

새로 알게 된 개념 : 인덱싱

::2

string = "홀짝홀짝홀짝"

print(string[0:5:2]) 
print(string[::2])
# 홀홀홀

::-1

string = "홀짝홀짝홀짝"

print(string[::-1])
# 짝홀짝홀짝홀

문제 3

이번주 제일 어려웠던 문제!

def get_len_of_str(s):  	  # s = sttrg로 주어진다고 가정
 
 result = 0			  # 가장 긴 길이를 반환하기 위해 선언
 string = ''			  # 알파벳 담을 빈 배열 선언

 for i in s:			  # 주어진 단어 sttrg의 알파벳 하나하나에 접근
   if i not in string:		  # 빈 배열에 i가 없으면
     string = string + i 	  # 담아. 그럼 st 까지 담길것 
   elif i in string:		  # 2번째 t는 이미 string에 담겨있으니까 이때
     if len(string) > result:     # string의 길이와 result=0 비교해서 전자가 길면
       result = len(string)       # result는 string의 길이로 다시 선언
       string = i 		  # 그리고 'st'였던 string은 i=t로 다시 선언
 
 return max(len(string), result)  # 그리고 for문을 다 돌고 나와서 리턴값으로 둘 중에 긴 값 반환 
  • 착안점 : 길이를 반환하는 문제였기 때문에 빈 배열 하나와 0이라는 숫자를 선언해두고 시작한 점
  • 난 똑똑하진 않지만 똑똑한 분들의 사고를 배우는 것은 정말 재밌다ㅎㅎ

문제 4


def same_reverse(num):
    # 아래 코드를 입력해주세요.
    str_num = str(num)
    result = '' 

    for i in str_num:
      result = i + result

    if result == str(num):
      return True

    else:
      return False

if문을 for문 안에 넣으면 몇 개가 테스트 통과가 안되는데 왜일까?
이럴 경우 인자로 받은 str_num 전체로 if문을 돌리게 되는 것이 아니라
str_num의 요소 한 개 한 개씩 if문을 돌리게 되는 것이므로 오류가 난다


문제 5

def get_prefix(strs):
  sorted_strs = sorted(strs)
  res = ''

  if len(strs) == 0:    # 이 부분을 끝까지 생각 못했음 ㅠㅠ
    return ''

  for idx, i in enumerate(sorted_strs[0]):
    if i == sorted_strs[-1][idx]:
      res = res + i
    else :
      break

  return res

print(get_prefix(['start', 'stair', 'step']))
  • 착안점 : sorted() 함수로 정렬해주는 게 중요! 1시간정도 고민하면서 겨우 생각해낸 것... ㅠㅠ 정렬해주고 배열의 첫번째 단어와 마지막 단어의 각 인덱스의 알파벳들을 비교해서 같다면 중간의 단어는 같은 것이라는 생각

좋은 웹페이지 즐겨찾기