3일 미니 프로젝트 발표하자 마자 단 1분도 쉬지 않고 냅다 일주일 알고리즘 40문제 카운트다운이 시작돼버림;;.. 역시 험난한 정글. 그치만 프로젝트 끝난 날은 회식이라 오랜만에 2까지 부어라 마셔라 재밌었다^_^
백준에서 난이도별로 정해진 문제를 푸는 건데, 이번주가 첫 주차라서 초반 40문제 정도는 금방금방 풀었다. Hello World같은거라서.. 근데 뒤로 가서 난이도가 하-상, 중 정도 올라가니까 하루에 두 문제 푸는 것도 감지덕지ㅠㅠ 그나마 챗GPT랑 무려 백준 플래이신 팀원분의 도움을 받아 어찌저찌 마감날에 40문제를 다 풀었다. 다음주부터는 하-하 문제도 없고 난이도 확 올라갈 것 같은데 어째 다 푸냐ㅠ
풀면서 새롭게 알게되는 파이썬 문법 같은건 노션에 정리했고, 여기는 알고리즘을 풀 때 주의해야 할 사항들을 정리해봤다.
string
에 담아서 +=
하는건 시간 상 아주 비효율적이다. 하노이 다 풀어놓고 이것 때문에 시간초과 계속 나서 몇시간 고민함. array
에 넣어서 .append()
하는 게 훨씬 빠르다.global 변수
선언을 해줘야 한다.cost
를 input으로 받았는데, cost
가 0
이면 비용이 0으로 싸게 갈 수 있는 길이 아니라 못 가는 길임을 생각해야 한다. 아니면 최소 비용에 못 가는 길이 자꾸 포함돼서 틀림.cost 0
문제에서 고려하지 못한게 하나 더 있었는데, index out of range
문제 때문에 for
루프 밖에서 별도로 n-1번째에서 0번째 갈 때
에 대한 비용을 처리했는데 여기에서도 n-1→0의 cost
가 0
일때를 고려줘야 한다는 걸 못 챙겼다.float(inf)
로 하는 것도 방법이다..sort()
안됨->퀵소트 안됨->머지소트 안됨->카운팅소트로 해결했다ㅋㅋㅋ 이 경우에는 입력값이 최대 '만 * 천만개'로 너무너무 커서 이걸 array
에 다 저장하면 메모리가 못 버티기 때문에 저장하지 않고도 정렬할 수 있는 카운팅소트가 정답이었다. 이번에 처음 알게 된 정렬 방식인데, 누적 도수분포표를 만들어서 해당 등급 내에 몇개가 있는지를 이용해 빈 배열에 채워넣기! 항상 구현하는데 급급해서 입력 최댓값은 한 번도 신경 써 본 적이 없는데 신박한 문제였다.set()
안에는 string
, number
, tuple
만 넣을 수 있다. 원칙적으로는 이터러블이 들어가면 되는 거라 일반 list
정도는 넣어서 만들 수 있긴 한데, 이중 list
넣어서 중복 제거하려면 set(map(tuple,list))
혹은 set([tuple(i) for i in arr]
로 튜플로 형변환 해서 넣어줘야 한다.if n in dict: return dict[n]
) 해야 시간초과가 나지 않는다. 그리고 여기서 arr
를 dict
의 key값으로 쓰려면 arr
그대로는 안되고 tuple
로 만들어야 한다.(tuple(arr)
)import itertools, itertools.combinations
같이 가져다 쓰는 게 훨씬 빠르다. 굳이굳이 힘들게 구현했는데 더 오래걸리는 바보같은 짓은 하지 말자...break
하기 전에 w=True, diag=True
로 플래그 값을 변경해버리면 count++
하고나서 그 전 배치(n-2번째)로 돌아갔을 때 플래그에 n-1번째에 변경한 True
값이 그대로 저장돼 있고, 이미 그 호출을 빠져나왔기 때문에 n-1번째를 선택하기 전으로 되돌릴 방법이 없다. 따라서 break
하고 나서 플래그 True
값 주고, i+1번째 호출 끝나면 다시 False
값으로 되돌리기.