3.2 좋은 코드를 짜기 위한 원칙 - 간결한 코드 작성하기 전역변수는 실제 프로그래밍에서는 프로그램의 흐름을 파악하기 어려워 대개 사용하지 않는 것이 좋지만 코테에서는 광범위하게 사용해도 된다. - 적극적으로 코드 재사용하기 같은 코드가 3번 이상 반복되면 코드를 모듈화하는 것이 좋다. - 표준 라이브러리 공부하기 표준 라이브러리 활용을 최대화 하지만 기본적인 배열, 스택, 큐, 리스트, 사전 등의 자료구조 그리고 정렬 등의 표준 알고리즘 구현법은 잘 알아둬야 한다. - 일관적이고 명료한 명명법 사용하기 모호한 명명법을 사용하지 말자. 의미를 이해할 수 있는 명명법을 사용하자 - 자료를 정규화해서 저장하기 시간대, 각도 등 여러가지 방식으로 표현 가능한 변수들의 정의를 한가지로 통일하여 정규화한다. -..
- 문제 상황 : 주어진 리스트를 O(N)으로 순회하며 그 안에서 target - nums[i]의 꼴로 검색할 경우 O(N^2)의 순회가 되어 시간이 초과된다. - 해결책 : 먼저 O(NlogN)의 sort 함수를 사용해 nums를 정렬한 후, 인덱스의 시작점과 끝점을 주어 찾는 값이 target보다 작으면 앞쪽 인덱스를 증가시키고 더 크면 뒷쪽 인덱스를 감소시키는 방향으로 찾는다. - Check Point : 문제에서 주어진 상황이 답이 항상 존재하기 때문에 가능한 방식이다.
😅 문제 문제 이미지 넣기 🤔 문제 상황 - 리스트에 존재하는 수를 제외한 자연수 중 최소값 찾기 🧐 해결 전략 - 1부터 시작해서 배열에 존재하면 1 증가시키고 없으면 반환하는 함수를 만들었다. ==> O(N**2) 의 시간이라 시간 초과가 뜬다. 66% - 다시 생각해서 만든 코드는 중복을 제거하며 정렬한 후에 조건에 맞게 구현하였다. ==> O(N) or O(N*(logN)) 🎰 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def solution(A): setA = sorted(list(set(A))) idx = 0 for i in range(len(setA)): if setA[i] > 0: idx = i break setA = setA[idx:] start = 1 for ..
😅 문제 https://app.codility.com/programmers/lessons/4-counting_elements/max_counters/ 🤔 문제 상황 - 조건에 따라 연산이 다르다. 🧐 해결 전략 - 🎰 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(N, A): ck = [0]*N mx = 0 for i in range(len(A)): if A[i] mx: mx = ck[A[i]-1] else : ck = [mx]*N # for j in range(N): # ck[j] = mx return ck cs https://colorscripter.com/ 🧙♂️ 해설 손글씨로 이미지 넣기 📈 새로 학습한 것 & 실수 - N+1 조건이 나올 때 else 조건 안..
😅 문제 https://app.codility.com/programmers/lessons/4-counting_elements/frog_river_one/ 🤔 문제 상황 - 문제 이해가 너무너무 어려운 문제였다. - 둑을 건너기 위해, 예를 들어 거리가 5인 둑이라면 낙엽이 1, 2, 3, 4, 5 모두에 낙엽이 있는 최소 시간을 구하는 문제이다. 🧐 해결 전략 - 배열을 선언해 그 수가 나오면 0으로 초기화 하는 방식으로 한다. 🎰 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def solution(X, A): ck = [i for i in range(X+1)] cnt = 0 for k in range(len(A)): if A[k] O(N)로 바뀌었다.
😅 문제 https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/ 🤔 문제 상황 - 리스트를 긴 테이프라고 생각하여 왼쪽, 오른쪽으로 나눈다. 기준점 P를 중심으로 왼쪽의 총 합과 오른쪽의 총합 차이가 가장 작은 경우를 찾는다. - 리스트를 스캔하며 기준점을 정하는 이중 for문을 사용하였더니 무려 O(N*N)의 말도 안되는 속도가 나왔다.. - sum 함수 역시 내부적으로 스캔이 필요하므로 for문 안에 sum 을 쓰면 이중 for문의 효과가 난다. ==> 속도 이슈 발생 - 아무리 생각하여도 생각이 안나 다른 사람의 코드를 참고하였다. 🧐 해결 전략 - 양쪽의 총 합을 이미 구해놓고, 기준점만 정하며 오른쪽에서 빼..
😅 문제 https://app.codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/ 🤔 문제 상황 - 홀수들을 요소로 가진 배열이 있는데 한 개를 제외한 모든 요소는 짝수개의 짝을 이룬다. - codility는 속도 이슈에 민감해 문제가 있었다. 🧐 해결 전략 - 처음 생각한 전략은 단순히 배열을 스캔하면서 새로운 것이 나오면 check 리스트에 넣고, 이미 check 리스트에 있는 값이 나오면 그 값을 제거하는 식으로 했다. 하지만 문제는 제거하는 과정 자체에 O(N)의 스캔이 필요하므로 N*2 의 소요시간이 발생해 시간 초과가 났다. 즉, N의 길이를 가진 for문 안에서 remove를 사용하면 N*2 의 시간초과가 발생할 수밖에 없..
😅 문제 https://www.acmicpc.net/problem/6603 🤔 문제 상황 - k개 숫자들이 있는 집합에서 로또번호를 뽑기 위해 6개의 번호를 추출하는 경우를 모두 출력한다. 🧐 해결 전략 - 백트래킹을 사용해야하지만 나는 내장함수 combinations를 사용했다.. 백트래킹으로도 풀어봐야한다. 🎰 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # main 함수 만들때 import는 안에다 써주어야 한다. def main(): from sys import stdin from itertools import combinations testcase = [] while True: n = list(map(int, stdin.read..
- Total
- Today
- Yesterday
- 토마토#백준알고리즘#Python
- API#lazy#
- 파이썬알고리즘인터뷰#4장
- Distinct#Codility#Python
- 병든 나이트#BOJ#탐욕법#Python
- 미로 탐색#백준알고리즘#Python
- 터틀비치#리콘#xbox#controller
- 리모컨#완전탐색#BOJ#Python
- 종이자르기#분할정복#BOJ#Python
- 암호코드#dp#BOJ#Python
- Triangle#Sorting#Codility#Python
- Swift#Tuples#Range
- 랜선자르기#이분탐색#BOJ#Python
- PassingCars#Codility#Python
- 쿼드트리#BOJ#분할정복#Python
- django#slicing
- 반복수열#백준알고리즘#Python
- django
- 나무자르기#BOJ#이분탐색#Python
- N으로 표현#DP#Programmers#Python
- 순열사이클#BOJ#Python
- 백준 알고리즘#BackTracking
- 섬의개수#백준알고리즘#Python
- 배열합치기#분할정복#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- filter#isalnum#lower
- 텀 프로젝트#백준알고리즘#Python
- 날짜 계산#BOJ#완전탐색#Python
- Brackets#Stacks and Queues#Codility#Python
- 공유기 설치#BOJ#이분탐색#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |