오늘은 총 ()문제를 풀었다.
첫번째 문제는 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으로 채울 수 있다는 것을 알게되었다.
급이 높아질수록 점점 문제들이 어려워지는 것 같아서 한편으로는 풀 수 있는 문제가 별로 없으면 어떡하지 라는 걱정은 했지만 풀고난 후 짜릿했다. 비록 아직은 쉬운 코딩 문제를 풀 고 있지만 꾸준히 하다보면 실력이 늘 거라고 믿는다.
꾸준한게 제일 어렵고 꾸준한게 제일 무서운거 같습니다. 어려운 문제를 푸는것도 중요하겠지만 기본을 탄탄하게 하는게 제일 중요하다는거 잊지마세요! 화이팅!