4일차 문제

양진혁·2021년 11월 4일
0

문제풀이

오늘은 총 ()문제를 풀었다.

첫번째 문제는 5kyu 난이도 문제로

anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']

anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer']

anagrams('laser', ['lazing', 'lazy', 'lacer']) => []

word와 words중 서로 알파벳이 일치하면 결과값을 도출하는 문제였다.

def anagrams(word, words):
  sortword = "".join(sorted(word))
  new_list = []
  for i in range(len(words)):
    sortwords = "".join(sorted(words[i]))
    if sortword == sortwords:
      new_list.append(words[i])
  return new_list

나는 이 문제를 word와 words 모두 sorted()를 사용하여 알파벳 오름차순으로 정렬 후 일치하는 요소를 new_list에 추가해 주는 방법으로 해결했다.

두번째 문제는 6kyu 난이도 문제로
triple_double(451999277, 41177722899) == 1

triple_double(1222345, 12345) == 0

triple_double(12345, 12345) == 0

triple_double(666789, 12345667) == 1

즉 왼쪽에서 3번 반복된 숫자와 오른쪽에서 2번 반복된 숫자가 일치하면 1 아니면 0을 나타내는 문제이다.

def triple_double(num1, num2):
  r1 = []
  r2 = []
  r3 = []
  strnum1 = str(num1)
  strnum2 = str(num2)
  for i in range(len(strnum1)-2):
    if strnum1[i] == strnum1[i+1] and strnum1[i+1] == strnum1[i+2]:
      r1 +=strnum1[i]
    else:
      pass
  for i in range(len(strnum2)-1):
    if strnum2[i] ==strnum2[i+1]:
      r2 += strnum2[i]
    else:
      pass  
  for i in r2:
    if i == "".join(r1):
      r3 += i
  if r1 and r3 !=None and r1 == r3:
    return 1
  else:
    return 0

r1에 num1에서 3번 반복된 수를 r2에는 num2에서 2번 반복된 수를 r3는 r1과 r2에서 겹치는 수를 놓았다. 마지막으로 none이 아니면서 두 문자열이 겹친다면 1을 return 아니면 0을 return 하도록 했다.

세번째 문제는 5kyu 난이도 문제로
HH = hours, padded to 2 digits, range: 00 - 99
MM = minutes, padded to 2 digits, range: 00 - 59
SS = seconds, padded to 2 digits, range: 00 - 59
The maximum time never exceeds 359999 (99:59:59)

디지털 시계를 출력하는 것이다.

def make_readable(seconds):
  min, sec = divmod(seconds, 60)
  hour, min = divmod(min, 60)
  if seconds>359999:
    return False
  return f'{hour:02d}:{min:02d}:{sec:02d}'

divmod를 사용해서 시,분,초를 나눴고 만약 시간이 35999를 넘어가면 False를 출력하게 만들었다.

네번째 문제는 5kyu 문제로
[1, 2, 3], [4, 5, 6] --> 9 because (9 + 9 + 9) / 3
[10, 20, 10, 2], [10, 25, 5, -2] --> 16.5 because (0 + 25 + 25 + 16) / 4
[-1, 0], [0, -1] --> 1 because (1 + 1) / 2

리스트 왼쪽 n번째 요소와 오른쪽 n번째 요소를 뺀 후 절대값을 씌워 제곱한 수를 다 더해 평균을 내는 문제이다.

def solution(array_a, array_b):
  res_list = []
  plus = 0
  for i in range(len(array_a)):
    res = abs(array_a[i] - array_b[i]) **2
    res_list.append(res)
  for i in range(len(res_list)):
    plus += res_list[i]
  plus /= len(res_list)
  return plus

a와 b의 i번째 요소들을 빼 준 후 abs()를 통해서 절대값으로 만들어 준 후 제곱한 후 각 리스트의 길이만큼 나누어주었다.

오늘 배운 점 및 아쉬운점

두번째 문제는 충분히 코드를 줄일 수 있었는데 아쉬웠다. 또한 세번째 문제를 풀 때 모르는 것이 많아서 푸는데 시간이 오래 걸린것이 아쉬웠다.

오늘 배웠던 것은 세번째 문제를 풀 때 사용했던 divmod() 였다. 몫과 나머지를 구하려고 하다보니 divmod()라는 것을 알게 되었다. 그 전까지는 //, %을 통해서 몫과 나머지를 구했는데 이제는 그런 점에서 코드를 줄여나갈 수 있을 것 같다.
또 세번째 문제 마지막에 시간을 작성해야 하는데 1시 1분 1초의 경우 왼쪽에 01:01:01 이 아닌 1:1:1이 돼서 문제가 풀리지 않았는데 구글 검색 이후 :02d 를 통해서 왼쪽정렬이지만 빈칸을 0으로 채울 수 있다는 것을 알게되었다.

느낀점

급이 높아질수록 점점 문제들이 어려워지는 것 같아서 한편으로는 풀 수 있는 문제가 별로 없으면 어떡하지 라는 걱정은 했지만 풀고난 후 짜릿했다. 비록 아직은 쉬운 코딩 문제를 풀 고 있지만 꾸준히 하다보면 실력이 늘 거라고 믿는다.

1개의 댓글

comment-user-thumbnail
2021년 11월 5일

꾸준한게 제일 어렵고 꾸준한게 제일 무서운거 같습니다. 어려운 문제를 푸는것도 중요하겠지만 기본을 탄탄하게 하는게 제일 중요하다는거 잊지마세요! 화이팅!

답글 달기