코딩하며 알게되는 내용을 계속 업데이트할 예정입니다.
- 파이썬 내장함수 input()을 sys.stdin.readline()으로 변경하여 시간초과 해결.
- 입력부분에서 문자만 들어오는 경우와 문자,숫자 모두 들어오는 경우가 있었는데 (ex all , add 3 의 차이)
text,num = sys.stdin.readline().split()# 이 아닌 text = sys.stdin.readline().split() #로 저장하여 text[0]과 text[1]에 저장되는 데이터를 불러 사용할 수 있음.
- strip() 함수로 \n이나 공백제거가 가능하더라.
- dictionary 자료형은 dict["key"] = values 형태로 저장가능함.
- DP문제에 대한 풀이가 익숙하지 않음.DP의 특성상 발생하는 idnex error를 잘 관리해야함.
- DP문제로 풀이를 할 경우 time complexity적으로는 이득이 크지만 메모리 사용이 크기 때문에
입력값 N이 큰 경우 DP로 N만큼의 배열 index가 필요한 문제의 경우 메모리 초과가 발생할 위험이 큼. - set자료형에 대한 이해가 부족했음. set을 사용해 합집합,교집합등 비교하는 연산과정에서 잘 사용하면
효율적인 접근이 가능함. - input()내장 함수의 경우 뒤 개행문자를 떼고 들어오지만 sys로 호출하는 readline은 빠른만큼 개행문자를 달고 들어온다. 그래서 추가적인 문자열 처리가 필요한데 그 방법이 strip() 함수를 사용하여 개행문자를 제거하는 방법이다.
- 2차원 배열 만들때 헤멨던 부분이 있다. 이를 해결하기 위해서
# x,y를 입력받았을 때 second_dimension = [] for i in range(y): for j in range(x): lst.append(i) second_dimension.append(lst) #위처럼 2중 for문으로 2차원 배열 생성이 가능하다.
#또는 list comprehension을 통해
graph = [[0]*x for _ in range(y)] # 와 같은 방법으로 표현이 가능하다.
10. 4방향을 검사할 때 모든 경우를 if 로 처리하지 말고 할 수 있는 좋은 방법
```python
dx = [-1,1,0,0]
dy = [0,0,-1,1]
# 여기줄에서 if문으로 index error를 막기 위한 조건이 필요하지만 생략
for i in range(4)
four[x+dx[i]][y+dy[i]]
- BFS는 queue나 dequeue에 저장해서 pop() , leftpop()을 사용하여 푸는 경우가 많고, DFS는 재귀를 사용하여 쭉 한방향으로 들어가는 방식을 채택함을 알 수 있었다.
- 코드 줄이는 or 응용법
if n%2 ==0 : print("짝수") else : print("홀수") #위 코드를 아래 코드로 변경 가능하다. return "짝수" * (number%2 == 0) or "홀수" # or 는 앞이 True면 뒤에것을 읽지 않고 넘어간다 # 앞이 False면 뒤에 것을 읽고 뒤에 것이 True면 뒤에것을 출력한다.
- 람다와 조건 표현식을 사용해 코드 줄이기 - 다만 너무 중첩이 많은 코드라면 가독성과 유지보수를 위해 사용하지 않는것을 추천한다.
- 람다는 함수를 모든 값들에 적용시켜주는 apply와 map과 조건 표현식과 연계하여 사용한다면 범용성이 더 좋아진다
#람다 예제 x = lambda a,b : a+b print(x(1,3)) # 출력 결과 4 print((lambda a,b : a+b)(5,6)) # 출력결과 11 #조건 표현식 예제 (조건 표현식 2번 사용한 예제) True일떄 값 if 조건식 else False일 때 값 score = 90 "A" if 90<score<=100 else "B" if 80<score else "C"
- bfs, dfs 문제 풀 떄 주의할점
bfs, dfs 내에서 바꾼 횟수를 카운트 할 때 값에 1외의 값을 담을 수 있음을 알고있었는데도 문제에서 변한 토마토를 1로 바꾸라는 말을 했다고 graph의 값을 1 이상의 값을 넣는 방법을 떠올리지 못했다. 변화한 횟수를 담을 때 이전값 + 1 을 그래프의 새로운 값으로 초기화 해주면 된다. - read = sys.stdin.readline 로 선언해서
read()로 sys.stdin.readline()을 대신 사용할 수 있다. - 첫값과 마지막값을 비교하여 배열안에서 빼주는 경우 pop() 연산 말고 앞 뒤 인덱스값을 a,b로 저장하여 둘이 교차하면 배열안의 모든 값을 접근한것으로 판단하는 방식이 더 좋은 것 같다.
- zip을 활용한 전치하기 => 원소가 튜플이 됩니다.
matrix = [[3, 7, 9],
[4, 2, 6],
[8, 1, 5]]
zipped_matrix = list(zip(*matrix))
print(zipped_matrix) # [(3, 4, 8), (7, 2, 1), (9, 6, 5)]
# 전치 완료 후, 원소를 리스트로 활용하고 싶을 때
transposed_matrix = list(map(list, zip(*matrix)))
print(transposed_matrix)
# [[3, 4, 8], [7, 2, 1], [9, 6, 5]]
'알고리즘 문제 풀이 > 알고리즘 이론 공부' 카테고리의 다른 글
2장 Divide and conquer (0) | 2023.07.30 |
---|---|
1장 algorithm efficiency (0) | 2023.07.30 |
델타 탐색 이론 정리 (1) | 2023.07.30 |
BFS 이론 정리 (0) | 2023.07.29 |
DFS 이론 정리 (0) | 2023.07.27 |