멈추지 않고 끈질기게

[기타][메모용] 코테에서 자주 나오는 실수 본문

기타

[기타][메모용] 코테에서 자주 나오는 실수

sam0308 2024. 4. 11. 23:07

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

 

 

1. 오버플로우

 - 숫자 변수들끼리 사칙연산 시, 결과물이 해당 자료형의 최대값을 넘길 수 있으므로 주의 

#include <iostream>

using namespace std;

int main()
{
    int a = 2000000000; // 20억
    int b = 2000000000; // 20억
    int c = a + b;
    cout << c << endl;
}

사진 1. int 오버플로우

 

 

2. 계산하기 전에 캐스팅

 - 어떤 변수를 다른 변수들의 계산 결과로 초기화하는 경우, 우변의 피연산자들의 자료형에 영향을 받음

 - ex) long long c = a * b의 경우, a와 b가 int라면 우변의 계산결과 또한 int 타입이므로 int의 최대값을 넘지 못함

#include <iostream>

using namespace std;

int main()
{
    int a = 1000000000; // 100만
    int b = 1000000000; // 100만
    long long c = a * b;
    cout << c << endl;
}

사진 2. 변수 초기화 - 잘못된 예

 

 - 해당 이슈를 피하려면 피연산자 중 최소 하나 이상을 저장할 변수의 자료형으로 캐스팅할 것

#include <iostream>

using namespace std;

int main()
{
    int a = 1000000000; // 100만
    int b = 1000000000; // 100만
    long long c = static_cast<long long>(a) * b; // 피연산자 캐스팅
    cout << c << endl;
}

사진 3. long long 변수 초기화

 

 

3. 제한 조건

- 일부 문제에서 윗단의 설명과 제한 조건이 일치하지 않는 경우가 있음

 ex) 문제 설명: 중복 원소 가능

       제한 조건: 중복되지 않은 원소로 이루어진 벡터 

- 한번 놓치면 수렁에 빠지기 쉬우니 제한 조건은 꼭 잘 읽어보자

 

 

4. 불필요한 계산

- 불필요한 계산을 반복하지 않도록 종료 조건을 잘 설정하자

   ex) 수익금 나누기 : 0원이 되면 더 이상 계산할 필요가 없으므로 break 해야 함. 누락 시 시간초과

사진 4. 불필요한 계산

 

 

 

5. 숫자 변환

 - 값을 cin을 통해 입력받을 때, int와 같은 숫자 자료형으로 받는 경우 맨 앞자리가 0이라면 삭제됨

   ex) 09081234 -> 9081234

 - 앞자리의 0까지 살려야 하는 문제일 경우, 문자열로 받아서 저장

 - 혹은 숫자 계산이 필요한 경우, 우선 숫자로 처리하고 출력 직전에 변환하는 방식을 고려할 것

사진 5. 앞자리 0 누락