ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3.3 자주 하는 실수에 관하여 (2)
    알고리즘 [Study] 2020. 5. 7. 22:32

    • 이 블로그 내의 모든 내용은 알고리즘 문제 해결 전략 (저 구동만 출판: 인사이트) 내용을 요약한 것입니다. 
    • 제가 이해한 대로 정리한 내용이기에 본문의 내용과 상이할 수 있습니다. 

    3-1 장에 이어 자주하는 실수에 대해서 이어 정리해보겠습니다. 

    • 컴파일러가 잡아주지 못하는 상수 오타 

      1) 전부 대문자로 써야하는데 첫 글자만 대문자로 쓰는 경우 
      2) 0의 개수를 잘못 쓰는 경우 
      3) 자료형을 문제에 맞게 변경하지 않는 경우 


    • 스택 오버플로 

      1) 콜 스택(call stack)이 오버플로해서 프로그램이 강제 종료 되는 경우 ( 스택 허용량에 대해 알아 둘 필요가 있다) 
      2) 배열 등 큰 지역 변수를 스택에 잡으면 재귀 호출이 없어도 곧장 스택 오버플로가 나기 쉽다. 
      3) 자동으로 힙에 메모리를 할당하는 STL 컨테이너를 사용하거나 전역 변수를 사용하자 

    • 다차원 배열 인덱스 순서 바꿔 쓰기 

      1) 다차원 배열에서 인덱스의 순서를 헷갈려서 잘못쓰는 경우 
      2) 동적 계획법을 위한 메모이제이션 패턴을 사용할 때 자주 실수함 (8장에서 다룬다) 
      3) 한 특정 배열에 접근하는 위치를 하나로 통일하는 것이 좋다 
    • 잘못된 비교 함수 작성 

      1) 크기 비교, 사전순 비교만을 사용하더라도 충분한 문제에 복잡한 비교 함수를 작성하는 경우 
      2) C++, 자바, 파이썬 등 표준 라이브러리가 다르므로 < 연산 대신에 <= 연산을 비교 함수 모델로 쓰는 경우 
        * 자신이 사용하는 표준라이브러리가 어떠한 기준을 갖는지 명확히 알 필요가 있다!! 
    • 최소, 최대 예외 잘못 다루기 

      1) 최소 값과 최대 값이 예외가 되는 문제들이 많다, 코드를 짤 때 가장 작은 입력과 가장 큰 입력에 대해 제대로 동작할지를 생각해보자 
        ex) 소수 찾기 문제에서 1을 예외처리 해야하는 경우 
    • 연산자 우선순위 잘못 쓰기 

      1) 연산자 우선순위는 종종 잡기 힘든 버그를 만들곤 한다. 
    if(b & i == 0)

         이 if 문을 보면 1==0 이 우선이지만 b & i 가 우선인 것처럼 착각할 수도 있다.  (괄호를 적극 사용하자!) 

    • 너무 느린 입출력 방식 선택 

      대부분의 프로그래밍 언어에서는 입출력 할 수 있는 다양한 방법을 제공한다. 
      사용하는 언어에서 어떠한 입출력 방식이 빠른지 확인하고 미리 익혀두자 

      파이썬에서는 input() 말고 sys.stdin.readline() 를 사용하자.

      결론만 말하자면, 입출력 속도가 다음과 같다.

      sys.stdin.readline() > raw_input() > input()

    뭐 어느정도로 더 빠르고 느리냐는, 코딩 테스트 문제푸는 수준에서 다룰만한 내용이 아니므로 넘어가도록 하고, 직관적으로만 느꼈던 것은, input() 으로 코드를 제출할 시, 시간초과가 뜨지만, sys.stdin.readline() 으로 제출할 시 정답이 뜨더라는 것이다. 이와 비슷한 이슈는 이미 이전부터 있었다.

     

    글 읽기 - input()과 sys.stdin.readline()의 차이점이 뭔가요??

    댓글을 작성하려면 로그인해야 합니다.

    www.acmicpc.net

    • 변수 초기화 문제 

      1) 입력에서 사용한 전역 변수 값을 초기화하지 않고 그대로 사용하는 경우 
      2) 대부분이 예제문제에서 걸러지지만 그러지 않을 때도 있으므로 적절히 초기화하도록 신경 써서 코딩하자 

    댓글

Designed by Tistory.