알고리즘 문제 풀이/알고리즘 이론 공부

파이썬 문제풀이 오답노트

잘잔디 2023. 7. 27. 15:10

코딩하며 알게되는 내용을 계속 업데이트할 예정입니다.

  1. 파이썬 내장함수 input()을 sys.stdin.readline()으로 변경하여 시간초과 해결.
  2. 입력부분에서 문자만 들어오는 경우와 문자,숫자 모두 들어오는 경우가 있었는데 (ex all , add 3 의 차이)
    text,num = sys.stdin.readline().split()# 이 아닌 
    text = sys.stdin.readline().split() #로 저장하여 text[0]과 text[1]에 저장되는 데이터를 불러 사용할 수 있음.
  3. strip() 함수로 \n이나 공백제거가 가능하더라.
  4. dictionary 자료형은 dict["key"] = values 형태로 저장가능함.
  5. DP문제에 대한 풀이가 익숙하지 않음.DP의 특성상 발생하는 idnex error를 잘 관리해야함.
  6. DP문제로 풀이를 할 경우 time complexity적으로는 이득이 크지만 메모리 사용이 크기 때문에
    입력값 N이 큰 경우 DP로 N만큼의 배열 index가 필요한 문제의 경우 메모리 초과가 발생할 위험이 큼.
  7. set자료형에 대한 이해가 부족했음. set을 사용해 합집합,교집합등 비교하는 연산과정에서 잘 사용하면
    효율적인 접근이 가능함.
  8. input()내장 함수의 경우 뒤 개행문자를 떼고 들어오지만 sys로 호출하는 readline은 빠른만큼 개행문자를 달고 들어온다. 그래서 추가적인 문자열 처리가 필요한데 그 방법이 strip() 함수를 사용하여 개행문자를 제거하는 방법이다.
  9. 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]]
  1. BFS는 queue나 dequeue에 저장해서 pop() , leftpop()을 사용하여 푸는 경우가 많고, DFS는 재귀를 사용하여 쭉 한방향으로 들어가는 방식을 채택함을 알 수 있었다.
  2. 코드 줄이는 or 응용법
    if n%2 ==0 : print("짝수")
    else : print("홀수")
    #위 코드를 아래 코드로 변경 가능하다.
    return "짝수" * (number%2 == 0) or "홀수"
    # or 는 앞이 True면 뒤에것을 읽지 않고 넘어간다
    # 앞이 False면 뒤에 것을 읽고 뒤에 것이 True면 뒤에것을 출력한다.
  3. 람다와 조건 표현식을 사용해 코드 줄이기 - 다만 너무 중첩이 많은 코드라면 가독성과 유지보수를 위해 사용하지 않는것을 추천한다.
  • 람다는 함수를 모든 값들에 적용시켜주는 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"
  1. bfs, dfs 문제 풀 떄 주의할점
    bfs, dfs 내에서 바꾼 횟수를 카운트 할 때 값에 1외의 값을 담을 수 있음을 알고있었는데도 문제에서 변한 토마토를 1로 바꾸라는 말을 했다고 graph의 값을 1 이상의 값을 넣는 방법을 떠올리지 못했다. 변화한 횟수를 담을 때 이전값 + 1 을 그래프의 새로운 값으로 초기화 해주면 된다.
  2. read = sys.stdin.readline 로 선언해서
    read()로 sys.stdin.readline()을 대신 사용할 수 있다.
  3. 첫값과 마지막값을 비교하여 배열안에서 빼주는 경우 pop() 연산 말고 앞 뒤 인덱스값을 a,b로 저장하여 둘이 교차하면 배열안의 모든 값을 접근한것으로 판단하는 방식이 더 좋은 것 같다.
  4. 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]]