코딩 테스트

[코딩테스트 3일차] BAEKJOON 2420번 : 사파리 월드, 2475번 : 검증수

sunlight-dby 2025. 4. 6. 00:58

[BAEKJOON 2420번 : 사파리 월드]

[문제]

[고찰]

사실 이 문제를 보자마자, int 타입의 N과 M을 선언하고 abs를 사용하여 절대값 사칙연산을 수행하였습니다.

하지만 그대로 제출을 했을 때 틀리게 되었고, 다시 문제에 대해 자세히 고민하였습니다.

 

고민하다보니, 제가 중요한 포인트를 놓쳤다는 것을 깨달았습니다.

N과 M의 범위는 ±2,000,000,000 사이에 위치해 있기 때문에 int 타입으로 N과 M을 선언했지만,

절대값 사칙연산이라는 부분에 대해 깊이 생각하지 않았던 것입니다.

 

[개념]

절대값 사칙연산이라는 부분이 포인트인 이유는, N과 M이 각각, -2,000,000,000과 2,000,000,000이라고 한다면, int 타입의 범위를 훌쩍 뛰어넘게 됩니다.

 

그렇다면, 해당 문제의 계산에서 최대, 최소로 나올 수 있는 값인  ± 4,000,000,000을 만족할 수 있는 자료형은 long long 타입이 있습니다.

 

C++에서 long 타입의 자료형은 존재합니다. 8바이트의 크기를 가질 때에 long 타입과 long long 타입의 범위는 같습니다.

하지만, long long 타입을 사용하죠. 그 이유는 long이라는 자료형은 OS별 크기가 달라지기 때문입니다.

 

int 타입과 long 타입을 비교해보면,

 

int는 OS별 크기가 같습니다. 

32bit 환경에서도 4byte의 크기를, 64bit 환경에서도 4byte의 크기를 가집니다.

(16bit에서는 2byte의 크기를 가지지만 현재 16bit OS 환경은 잘 사용되지 않으므로, 논외로 하였습니다.)

 

long 타입은 OS별 크기가 다릅니다.

32bit 환경에서는 4byte의 크기를, 64bit 환경에서는 8byte의 크기를 가집니다.

(참고로 16bit에서는 4byte의 크기를 가집니다만, 컴파일러 및 시스템에 따라 2byte의 크기를 가질 수도 있습니다.)

 

결국, long 타입으로도 해결이 가능할 수 있지만, 안전성을 위해 long long 타입을 쓰는 것이 더 현명한 선택일 수 있습니다.

 

[32bit 환경에서의 int, long, long long 타입]

자료형 크기 범위
  int 4 byte    -2,147,483,648 ~ 2,147,483,647
  unsigned int 4 byte     0 ~ 4,294,967,295
  long (int) 4 byte     -2,147,483,648 ~ 2,147,483,647
  unsigned long (int) 4 byte     0 ~ 4,294,967,295
  long long 8 byte   -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  unsigned long long 8 byte     0 ~ 18,446,744,073,709,551,615

 

 

[정리]

결국, 해당 문제의 키워드는 함정이라고 보면 볼 수 있는, 절대값 사칙 연산에서의 값의 범위를 한번 더 생각하여 타입의 크기를 결정 짓는 것이었습니다.

 

앞으로 문제를 볼 때, 안일하게 생각하지 말고 더 많은 부분을 생각해야겠습니다.

 

[Solution]

#include <iostream>

using namespace std;

int main()
{
	long long n, m;

	cin >> n >> m;

	cout << abs(n - m);
}

 

 


 

[BAEKJOON 2475번 : 검증수]

 

[문제]

 

[고찰]

해당 문제를 가져온 이유는 아이디어를 하나 정리하고 싶어서 입니다.

매우 쉬운 문제이지만, 나중에 이 문제에서 사용되는 아이디어를 꼭 잊지 않기 위해 정리합니다.

 

[정리]

이 문제는 5개의 숫자를 각각 제곱한 수의 합을 10으로 나눈 나머지만 구하면 되는 쉬운 문제입니다.

 

하지만, 5개의 숫자를 일일이 제곱하여 더하고 10으로 나누는 방법은 미련한 방법이 될 수 있습니다.

 

이럴 때는 for문을 사용하여 각각의 숫자를 입력받고, 입력받은 숫자를 바로 제곱하여 한 변수에 더해놓습니다.그리고 마지막에 10으로 나누기만 하면 됩니다.

 

이런 식으로, 나중에 복잡한 문제에 이런 아이디어가 얽히더라도 간단하게 할 수 있는 방법을 되돌아가지 않았으면 좋겠습니다.

 

[Solution]

#include <iostream>

using namespace std;

int main()
{

	int num, square = 0;
	int answer = 0;

	for (int i = 0; i < 5; ++i)
	{
		cin >> num;

		square += num * num;
	}
	
	answer = square % 10;

	cout << answer;

	return 0;
}