[codekata] 22.02.14-22.02.18

김은지·2022년 2월 20일
0

코딩테스트

목록 보기
2/17

1일차

def two_sum(nums, target):
    hash_map = {}
    for index, value in enumerate(nums):
      remaining = target-value
      if remaining in hash_map:
          result = []
          result.append(hash_map[remaining])
          result.append(index)
          return result
      else :
          hash_map[value]=index
          
nums = [4, 9, 11, 13]
target = 13

print(two_sum(nums, target))
  • 느낀점 및 알게된 것
    1. Big-O표기법의 대략적 의미와 '리스트'의 시간복잡도
    1. hashmap 자료구조의 존재와 장점(어떻게 적용해야하는지는 아직 모르겠다)
    2. 문제의 과정을 말로 풀어서 해결해야겠다고 생각함...

2일차

def reverse(number):
    result = 0
    if number < 0:
        number = number * -1
        while number >0:
            remainder = number%10
            result = result*10 + remainder
            number = number//10
        return -result
    else:
        while number >0:
            remainder = number%10
            result = result*10 + remainder
            number = number//10
        return result
    
# 다른 분코드    
def reverse(number):
    if number > 0:
        return int(str(number)[::-1])
    else:
        return int(str(number).replace('-','')[::-1])
    

print(reverse(-1234))
  • 느낀점 및 알게된 것
    처음에 슬라이싱으로 문제를 풀어야겠다고 생각하고 문제를 풀기 시작했는데, 음수를 어떻게 해결할지 고민하다가 결국 문자열로 숫자를 바꾸지 않는 방법으로 풀게 되었는데 과정을 생각하면 머리가 뒤죽박죽 되었다.
    깨달은 것
    1. 문제 해결 순서를 정립하지 않고 코드를 쓰는게 더 오래걸린다.
    2. 생각한대로 코드를 쓸 수 없다는 점 이다...
    주변 동기분들께 물어보니 문제 해결 과정을 말로 풀어서 써보라는 말을 들었다.
    한 번 해봐야겠다고 생각했다.
    그리고 모르는 파이썬 함수도 많고, 생각한대로 코드를 쓸 수 가 없다. 문맹이 된 답답함이 이런걸까? 지난번에도 이런 문제에 부딫혀서 기본서를 하나 파고들어야겠다고 생각했는데 겨우 겉핥기로 한 번 훑어서... 그렇기도 한 것 같고 연습이 부족한 것 같다. 반성...

3일차

#짝꿍 풀이
def get_len_of_str(s):
    temp_str = []
    max_length = 0
    for i in range(len(s)):
        if s[i] not in temp_str:
            temp_str.append(s[i])   
        else:
            temp_str =[s[i]]
        
        if max_length < len(temp_str):
            max_length = len(temp_str)
    
    # max_length = max(max_length, len(temp_str))
    return max_length


#답안..?

# def get_len_of_str(string):
#   dct = {} 
#   max_so_far = curr_max = start = 0

#   for index, i in enumerate(string):
#       if i in dct and dct[i] >= start:
#           max_so_far = max(max_so_far, curr_max)
#           curr_max = index - dct[i]
#           start = dct[i] + 1
#       else:
#           curr_max += 1
#       dct[i] = index
#   return max(max_so_far, curr_max)

# a = "abcadefgi"
# print(get_len_of_str(a))

# print(get_len_of_str("abcabc"))
          
str1 = "abcabcabc"
str2 = "aaaaa"
str3 = "sttrg"
str4 = 'abcdefgtajg'

^_^ 이건 아직 못 풀어서... 짝꿍답을 가져왔다. 답안을 보고도 한참 생각했다. 완전 이해하면 한 번 다시 풀어봐야겠다... 약간의 자괴감이 들까 했지만 극복~~~! 짝꿍답은 test를 하나 통과하지 못 한다...

4일차

def reverse(number):
    if  number < 0 or (number % 10 == 0 and number != 0):
       return False
    else :
       if number != int(str(number)[::-1]):
           print(int(str(number)[::-1]))
           return False 
       else: 
           return True
       
#짝꿍 코맨트
#T/F를 뒤집어 쓰는게 더.. 쓰기 간단할지도?.?

#짝꿍 코드
import math
def same_reverse(num):
    # 아래 코드를 입력해주세요.
    if num<0:
        return False
    string_num=str(num)
    string_length=len(string_num)
    for i in range(math.ceil(string_length/2)):
        if string_num[i]!=string_num[string_length-1-i]:
            return False
    return True
     
   
number1 = 123 #f
number2 = 1221 #t
number3 = -1221 #f
number4 = 0 #t
number5 = 1230 #f

풀었다. 시원하다. 이번에는 문제가 무척 쉽기도 했지만, 첫 날에 배운 슬라이싱을 써먹었다. 그리고 머리를 떠돌던 문제 해결 방법을 순서대로 적어보며 문제를 풀었다. 해결하니 무척 행복하다...

5일차

def get_prefix(strs):
    # 빈 자료형이면 'False'니까
    if not strs:
      return ''

    word_length_list =[]
    for string in strs:
      word_length_list.append(len(string))
    min_length = min(word_length_list)
    
    prefix = ''
    for i in range(min_length):
        for string in strs:
            if string[0][i] != string[i]:
                return prefix
    prefix += string[i]
            
          
'''
짝꿍 코드에서 배운게, join하면 list와 string을 합칠 수 있다는 것
그리고 for문의 순서를 바꾸는 것을 통해 생각한대로 문제 해결할 수 있다는 것
필요한 것이 있으면 반복을 시작하기 전에 미리 구하는 것으로 문제를 간단하게 할 수 있다는 것 
해결해야할 문제를 뭉텅이로 놔두지 말고 하나씩 풀어 놓으면
해결하기 좋다는 것
'''

#짝꿍 코드 
def get_prefix(strs):
  word_length_list=[]
  if not strs:
    return ''
  for string in strs:
    word_length_list.append(len(string))
  minimum_length=min(word_length_list)
  prefix=[]
  
  for i in range(minimum_length):
    for string in strs:
      if strs[0][i]!=string[i]:
         return ''.join(prefix)
    prefix.append(strs[0][i])
  return ''.join(prefix)

처음에는 이 문제도 문제 풀이 과정을 말로 정리하는 것으로 먼저 접근했다.
반복문을 돌리며 발생할 수 있는 오류(index out of range)를 방지하기 위해 먼저 가장 짧은 단어의 길이를 구했고,
이후에 prefix를 for문을 통해 구했는데, 처음에는 두 for문의 순서를 서로 바꿔써서 원하는 답이 안 나왔다. 왜 그랬을까..? 풀긴 풀었다!
이래서 별찍기를 해야하는건가 싶었다...

그리고 짝꿍 너무 감사하다... 매번 나보다 훨씬 빨리 방법을 생각하고 아는 것도 훨씬 많은데 내가 충분히 생각할 수 있도록 기다려주고 지켜봐준다. 그리고 난처해하면 떠먹여주지 않고 하나씩 힌트를 준다. 그리고 더 효율적인 방법을 생각할 할 수 있도록 해주고 제안해줌... 다정한데 떠먹여주지 않는... 호랑이 훈장님 같은... 느낌의 짝꿍....

너무 감사하고 나도 꼭 도움이 되고싶다...

0개의 댓글