오늘은 처음으로 코딩테스트를 연습해보았다.
이거 하다보니 엄청 재밌다. 너무 어려운 문제는 머리도 쥐어뜯어가면서 해결해보려고 하고 또 못풀기도 했지만, 이렇게 고민하는 과정을 겪는 것만으로도 엄청 배우게 되고 도움이 되는 것 같다. 일주일에 한번만 하는게 아쉬울 정도!
평균 구하기
Q. 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
(arr은 길이 1 이상, 100 이하인 배열, arr의 원소는 -10,000 이상 10,000 이하인 정수)
<나의 답> def solution(arr): answer = sum(arr)/len(arr) return answer
수박수박수박수..수박수..
Q. 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
(n은 길이 10,000이하인 자연수입니다.)
<나의 답> def solution(n): answer = ' ' if n % 2 == 0: answer = '수박'*(int(n/2)) else: answer = '수'+'박수'*(int(n//2)) return answer <다른사람들의 답> def water_melon(n): s = "수박" * n return s[:n] ------------------------------ def water_melon(n): return "수박"*(n//2) + "수"*(n%2)
다른 사람들 풀이를 보고 다들 정말 대단하다고 느꼈다. 나는 열심히 따라가야겠다.
행렬의 덧셈
Q. 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
(행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.)
<나의 답> def solution(arr1, arr2): answer = [] for i in range(len(arr1)): list_in_answer = [] for j in range(len(arr1[i])): list_in_answer.append(arr1[i][j]+arr2[i][j]) answer.append(list_in_answer) return answer <다른 사람들의 답> def sumMatrix(A,B): answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)] return answer -------------------------- def sumMatrix(A,B): for i in range(len(A)) : for j in range(len(A[0])): A[i][j] += B[i][j] return A -------------------------- def sumMatrix(A,B): return [list(map(sum, zip(*x))) for x in zip(A, B)] -------------------------- def sumMatrix(A,B): answer = [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
이 문제가 정말 어려웠던 대신에 많이 배울 수 있는 문제였다.
2차원 리스트에 대한 개념 자체가 계속 헷갈려서, 시도했다가 틀리고 수많은 시행착오를 겪으면서 겨우 완성했는데, 여러 다른 내장함수들을 이용하면 편하게 풀 수 있을 것 같다.
zip함수, map함수, 리스트 컴프리헨션을 이용한 리스트 표현식, += 에 대한 개념
더 보충해야겠다.
완주하지 못한 선수
Q. 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
(마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.)
<나의 답> def solution(participant, completion): for person in participant: if person not in completion: return person elif participant.count(person) != completion.count(person): return person else: continue
마지막 문제는 결국 통과하지 못했다.
정확도 테스트에서는 통과했지만 효율성 테스트에서 떨어졌다.
다른 사람들의 답을 살펴보니 sort함수가 제일 많이 쓰였고,
collection 라이브러리의 counter 함수를 쓰면 효율성 테스트에서 엄청 빠르게 처리되어 가장 효율적인 코드로 작성할 수 있을 것 같았다.
주말을 이용해서 열심히 분석해서 여러 개 답을 업데이트 해봐야겠다.