listx =[] defsolution(numbers): for x in range(len(numbers)): num_x=numbers[x] sum =0 for y in range(x+1,len(numbers)): num_y=numbers[y] sum = num_x+num_y ifnot sum in listx: listx.append(sum) answer=sorted(listx) print(answer) return answer
재정의
numbers의 길이는 2이상 100이하이고, numbers의 모든 수는 0이상 100이하이다. 중복이 없이 2개를 뽑아 조합이 가능한 수를 나열한 리스트를 반환하면된다.
계획
완전 탐색 이용, for문 안에 for문을 사용해서 모든 조합을 탐색하여, 조합을 set()에다가 넣는다면 중복방지를 구현할수있다. 순서가 없는 자료형이므로 인덱스, slice를 사용하지못한다. 마지막으로 sorted()로 감싸준다. 오름차순!
구현
1 2 3 4 5 6
defsolution(numbers): set_x=set() for x in range(len(numbers)): for y in range(x+1,len(numbers)): set_x.add(numbers[x]+numbers[y]) #set에다 바로박음 return sorted(list(set_x)) #마지막 리턴은 리스트여야하므로
리뷰
다른 사람들을 보면 list_x=[]를 먼저 사용하고 마지막 최종 답을 return 할떄 sorted(list(set(list_x)))를 하였다. 이 문제말고 다른 문제들은 인덱스를 활용해야할수있으므로 바로 set을 활용하는거보다 리스트로 활용후 최종적으로 잠깐 set활용하는것이 더 나은 방법이다.
set을 사용한다고 해서 자동으로 오름차순으로 정렬되지 않습니다. Python의 set은 BBST가 아니라 HashSet의 형태
defsolution(board, moves): basket=[] count=0 for crane in moves: for i in board: ifnot i[crane-1] ==0: basket.append(i[crane-1]) i[crane-1]=0#꺼낸후 0으로 초기화 break if len(basket)>1: if basket[-1]==basket[-2]: count+=2 del basket[-1] del basket[-1] return count
#15:57 # NxN크기의 정사각 격자., 격자아래칸부터 차곡차곡쌓여있다. #크레인 이 담으면 바구니에 담기고 같은게있으면 터짐없어짐 # 크레인이 인형이 없는 위치에 가면 아무일도 일어나지 않는다
#board는 게임 격자 인형들, moves는 크레인이 담을 위치 # return 사라진 인형의 개수(터진것)
## 가장중요한 로직은 배열에서 추출후 0으로만들고 ## 바구니에서는 내가 넣을것과 같은 종류가 맨위에있다면 제거
defsolution(board, moves): basket=[] count=0 for m in moves: m-=1 for i in range(len(board)): if board[i][m] !=0: print(board[i][m]) basket.append(board[i][m]) board[i][m] =0
if len(basket)>1: if basket[-1]==basket[-2]: basket.pop() basket.pop() count+=1 break return count*2
defsolution(participant, completion): sort_participant = sorted(participant) sort_completion = sorted(completion) for i in range(len(sort_completion)): if sort_participant[i] != sort_completion[i]: return sort_participant[i] return sort_participant[-1]
재정의
A 와 B리스트에서 겹치는 이름도 존재하며, A는 존재하고 B에는존재하지 않는 이름을 찾으면 된다
계획
정렬후에 만약 다른것이 나타난다면,리턴하면되지않을까?
하나만다르기때문에 A를 기준으로 돌다가 인덱스가 A와 B가 틀리면 그 위치에 A를 반환하면될것이다
defsolution(answers): count_person1,count_person2, count_person3 =0,0,0 len_answers = len(answers) person1_answers = [1,2,3,4,5]*math.ceil(len(answers)/5) person2_answers = [2,1,2,3,2,4,2,5]*math.ceil(len(answers)/8) person3_answers = [3,3,1,1,2,2,4,4,5,5]*math.ceil(len(answers)/10) for x in range(len(answers)): if person1_answers[x] == answers[x]: count_person1 +=1 for x in range(len(answers)): if person2_answers[x] == answers[x]: count_person2 +=1 for x in range(len(answers)): if person3_answers[x] == answers[x]: count_person3 +=1 count_result_list=[count_person1,count_person2,count_person3] m = max(count_result_list) result = [i+1for i, j in enumerate(count_result_list) if j == m] return result
재정의
수포자는 패턴을 반복하고
answer와 비교하여 몇개를 맞췄는지보고 높은 사람을 반환한다(1,2,3이라는 사람)
동점이라면 오름차순 반환
계획
구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from itertools import cycle
defsolution(answers): giveups = [ cycle([1,2,3,4,5]), cycle([2,1,2,3,2,4,2,5]), cycle([3,3,1,1,2,2,4,4,5,5]), ] scores = [0, 0, 0] for num in answers: for i in range(3): if next(giveups[i]) == num: scores[i] += 1 highest = max(scores)
return [i + 1for i, v in enumerate(scores) if v == highest]
답안을 참조했다. cycle은 이터레이터를 반환한다. next()를 활용해서 계속 번호가 순환할수있다.
리뷰
from iterloop import cycle에 꼭 주목하자
패턴을 generator로 처리하여 가독성, 공간복잡도도 줄였다.
문제의 접근방법에 대해서는 다르지 않았다.
cycle을 사용하지 않고 더 간단한 방법은 나머지를 이용하는 방법으로 계속 참조하는것이다.
defsolution(n, lost, reserve): saved_number = 0 xx = [] for x in lost: if x in reserve: reserve.pop(reserve.index(x)) saved_number+=1 else: xx.append(x)
for x in xx: if x-1in reserve: reserve.pop(reserve.index(x-1)) saved_number+=1 elif x+1in reserve: reserve.pop(reserve.index(x+1)) saved_number+=1 answer = n - len(lost) + saved_number return answer
재정의
n 전체 학생수(1부터시작)
lost 읽어버린 사람들(1명이상)
reserve 여벌의 체육복의 학생
바로 앞번호나 바로 뒷번호의 학생에게만 체육복을 발려줄수있다.
return 최대한 많은 학생이 수업들을수있는 수
혹시 reserve와 lost에 동시에있는 숫자는 제거해야한다
계획
remove를 사용하여 요소를 제거하면 혹시라도있을 중복도 해결가능
구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
defsolution(n, lost, reserve): count=0 up_reserve=[x for x in reserve ifnot x in lost] up_lost=[x for x in lost ifnot x in reserve] for number in up_lost: if number-1in up_reserve: up_reserve.remove(number-1) count+=1 elif number+1in up_reserve: up_reserve.remove(number+1) count+=1 answer=n-len(up_lost)+count return answer
리뷰
나와 완전 비슷한것이 답안 이였다. 이럴때가 진짜 행복하다
단지 reserve와 lost 위치를 바꿨다…더 줄일수있었다. 마지막 남은 lost 길이를 빼면되니까!
1 2 3 4 5 6 7 8 9 10 11
defsolution(n, lost, reserve): _reserve = [r for r in reserve if r notin lost] _lost = [l for l in lost if l notin reserve] for r in _reserve: f = r - 1 b = r + 1 if f in _lost: _lost.remove(f) elif b in _lost: _lost.remove(b) return n - len(_lost)
defsolution(a, b): monthlydate=[31,29,31,30,31,30,31,31,30,31,30,31] remain_date = 0 if a>1: for x in monthlydate[:a-1]: remain_date+=x remain_date+=b y = remain_date%7 print(y) answer = ["THU","FRI","SAT","SUN","MON","TUE","WED"][y] return answer
재정의
2016년 1월 1일은 금요일
2016년 a월 b일은 무슨요일?
없는날은 주어지지않는다
계획
데이터와 로직을 분리하자
["THU","FRI","SAT","SUN","MON","TUE","WED"]
[31,29,31,30,31,30,31,31,30,31,30,31]
구현
1 2 3 4 5 6 7 8
defsolution(a, b): dn=["THU","FRI","SAT","SUN","MON","TUE","WED"] dtn=[31,29,31,30,31,30,31,31,30,31,30,31] sum=0 for i in range(a-1): sum+=dtn[i] answer=dn[(sum+b)%7] return answer
defsolution(arr): result = [] first = arr[0] result.append(first) for x in range(1,len(arr)): second=arr[x] if first == second: pass else: result.append(second) first=arr[x]
return result
재정의
배열 arr, 각 원소 0~9까지
return 배열에서 중복숫자 제거후 숫자 배열순서는 유지
계획
set를 활용하면 위치 index가없기때문에 배열순서 유지못한다.
for문을 돌면서 다음것과 같으면 건너뛰고 append()를 활용하면되지않을까?
구현
1 2 3 4 5 6 7 8 9
defsolution(arr): result=[] for i in range(len(arr)): if i ==len(arr)-1: result.append(arr[i]) break ifnot arr[i] == arr[i+1]: result.append(arr[i]) return result
리뷰
1 2 3 4 5 6
defsolution(arr): result=[] for x in arr: ifnot result[-1:]==[x]: result.append(x) return result
slice의 특성을 이용하자.. 와 대박 문자열 비어있어도 slice는 오류안내고 빈리스트 반환함.
rent_cost_list = [] for x in range(case_count): input_score = input("공연장으 대여할수있는 날N +L").split(" ") N_score, L_score = int(input_score[0]), int(input_score[1])
# L이상의 공연을 진행해야함 input_list = input("날짜별로 대여 비용") rent_cost_list2 = input_list.split(" ") print(rent_cost_list2) for x in rent_cost_list2: y = int(x) rent_cost_list.append(y) print(rent_cost_list)
for_count = N_score - L_score + 1# 돌아야하는 나눠서 횟수
check_answer(for_count, L_score)
완전 잘못되었다. 접근법이 메모리를 너무 많이 잡아먹고, 비효율적이다
다른접근법을 생각해보자면 시작점을 for문으로 돌면서 시작점으로부터 L만큼 합의 평균과과 그 다음값을 비교하면서 다음값보다 평균이 크다면 확장하는 방식으로 해결해야될거같다.