프로그래머스 - 평균 구하기
평균 구하기 문제 바로가기 나의 풀이 def solution(arr): answer = sum(arr)/len(arr) return answer CODE REVIEW 간단한 구현 문제. 예제에서 input이 [5,5]일 때에 output이 5.0이 아닌 5이길래 나누어 떨어질 땐 따로 처리해야하나 고민했는데, 그럴 필요는 없었다. 5.0으로 출력되어도 정답 처리된다.
평균 구하기 문제 바로가기 나의 풀이 def solution(arr): answer = sum(arr)/len(arr) return answer CODE REVIEW 간단한 구현 문제. 예제에서 input이 [5,5]일 때에 output이 5.0이 아닌 5이길래 나누어 떨어질 땐 따로 처리해야하나 고민했는데, 그럴 필요는 없었다. 5.0으로 출력되어도 정답 처리된다.
백준 5430번 바로가기 첫 번째 풀이 t = int(input()) # 테스트 케이스의 개수 for _ in range(t): # 입력 p = input() # 수행할 함수 1~100,000 n = int(input()) # 배열에 들어있는 수의 개수 1~100,000 arr = input()[1:-1].split(',') if n == 0: arr = [] # 처리 for f in p: if f == "R": arr = arr[::-1] elif f == "D": if arr == []: print('error') break else: arr.pop(0) print('['+','.join(arr)+']') 두 번째 풀이 from collections import deque t = int(input()) # 테스트 케이스의 개수 for _ in range(t): # 입력 p = input() # 수행할 함수 1~100,000 n = int(input()) # 배열에 들어있는 수의 개수 1~100,000 arr = deque(input()[1:-1].split(',')) if n == 0: arr = deque() # 처리 for f in p: if f == "R": arr.reverse() elif f == "D": if arr: arr.popleft() else: print('error') break print('['+','.join(arr)+']') 세 번째 풀이 from collections import deque t = int(input()) # 테스트 케이스의 개수 for _ in range(t): # 입력 p = input() # 수행할 함수 1~100,000 n = int(input()) # 배열에 들어있는 수의 개수 1~100,000 arr = deque(input()[1:-1].split(',')) if n == 0: arr = deque() count = 0 # 처리 for f in p: if f == "R": count += 1 elif f == "D": if arr: if count%2 == 0: arr.popleft() else: arr.pop() else: print('error') break else: if count%2 == 1: arr.reverse() print('['+','.join(arr)+']') CODE REVIEW 첫 번째 풀이에서는 시간초과 에러로 걸렸다. list로 구현하다보니 탐색에 시간이 오래 걸린 모양이다. 두 번째 풀이에서는 deque를 활용했는데, 여전히 시간초과 에러가 발생했다. reverse()가 여러번 실행되면서 그런듯… 세 번쨰 풀이에서는 reverse()가 여러 번 호출되는 것을 방지하기 위해 count=0을 도입해서 홀짝성에 따라 pop() popleft()을 선택하고, reverse()는 한 번만 실행해주었다. 처음에는 만만하게 봤던 문제였는데, 생각보다 고려할게 많았다. 이런 기법들은 기억해두었다가 시간 단축이 필요할 때 써먹어야겠다.
달리기 경주 문제 바로가기 나의 풀이 def solution(players, callings): answer = [] names = {} ranks = {} for i,player in enumerate(players): ranks[i+1] = player names[player] = i+1 for call in callings: idx = names[call] p1 = ranks[idx-1] ranks[idx-1],ranks[idx] = call,p1 names[call],names[p1] = idx-1,idx answer=list(ranks.values()) return answer CODE REVIEW 처음에는 수열로 array[i],array[i-1]=array[i-1],array[i]처럼 구현했는데, 시간초과 문제가 발생하여 실패했다. 탐색 과정에서 소요되는 시간을 줄이기 위해 딕셔너리를 이용하여 구현했다. (순위,이름) (이름,순위) 순서쌍의 딕셔너리 두 개를 생성하고 call마다 각각의 딕셔너리를 업데이트 해주는 방식이다.
백준 1676번 바로가기 나의 풀이 num = 1 for i in range(1,int(input())+1): num *= i count = 0 for i in str(num)[::-1]: if i == '0': count += 1 else: print(count) break CODE REVIEW 주어진 n의 팩토리얼을 구하고 뒤에서부터 0의 갯수를 구하는 문제 str(num)[::-1]처럼 num을 str()처리하고 역순으로 바꾸면 더 쉽게 count할 수 있다. cf) ‘갯수’인지 ‘개수’인지 헷갈렸는데, 국립국어원에 따르면 사이시옷을 붙여 쓰지 않은 개수가 맞다고 한다.
백준 1002번 바로가기 나의 풀이 for _ in range(int(input())): a, b, c, d, e, f = map(int, input().split()) x = max(c,f) y = min(c,f) l = ((d-a)**2+(e-b)**2)**0.5 if a==d and b==e and c==f: print(-1) else: if l > x+y: print(0) elif l == x+y: print(1) else: if l > x-y: print(2) elif l == x-y: print(1) else: print(0) CODE REVIEW 중학교 때 배웠던 두 원의 위치관계를 응용한 문제였다. 경우만 잘 나눌 수 있다면 생각보다 구현은 어렵지 않았다. 거리 $r_{1}$과 $r_{2}$을 반지름으로 생각하고, x1 y1 x2 y2을 원의 중심으로 치환하면 간단한 중학교 수학문제로 바뀐다.