레이블이 cpp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cpp인 게시물을 표시합니다. 모든 게시물 표시

2019년 8월 21일 수요일

데이터형의 최대값과 최소값 정리입니다.

최대값이 1012를 세번 더한 값이 되는 문제가 있었습니다.

#include <iostream>
using namespace std;
int main(void)
{
 long long int A,B,C;
 cin >> A >> B >> C;
 cout << A+B+C << endl;
 
 return 0;
}
이렇게 간단히 풀리는 문제였는데, 혼자만의 고민에 빠집니다.
이렇게 쉬운 문제일리 없어
long long int 형에도 담지못할 큰 수이니 문자열로 받아서 더하기 처리하도록 해결해야 하는것이겠군..
그러다 long long int의 최대값(LLONG_MAX)이 900경(9223372036854775807)을 넘는다는 것을 알고선 정리를 해놔야겠다고 생각했습니다.

각 데이터 형의 최대값과 최소값이 정의된 헤더파일 
limits.h   : 기본형 : char, int, short, long ...
float.h    : 실수형 : float, double
stdint.h  : 특수형 : int32_t, int64_t, ...
각 데이터 형의 크기/범위
데이터형사이즈비트수 범위 
char18-128~127
unsigned char180~255
short216-32768~32767
unsigned short2160~65535
int432-2147483648~2147483647
unsigned int4320~4294967295
long(32bit 환경)432-2147483648~2147483647
unsigned long(32bit 환경)4320~4294967295
long(64bit 환경)864-9223372036854775808~9223372036854775807
unsigned long(64bit 환경)8640~18446744073709551615
long long864-9223372036854775808~9223372036854775807
unsigned long long8640~18446744073709551615
32비트 64비트 환경에 따라 달라지기도하고, 그렇다고 외울 순 없고, 직접 헤더파일을 확인해봤는데 알아보기도 어렵습니다. 각 헤더에 정의된 데이터타입의 최대값, 최소값을 소스상에서 직접 확인할 수 있습니다.

#include <iostream>
using namespace std;
int main(void)
{
 cout << "INT_MAX   :" << INT_MAX << endl;
 cout << "LONG_MAX  :" << LONG_MAX << endl;
 cout << "LLONG_MAX :" << LLONG_MAX << endl;
 return 0;
}
출력
INT_MAX :2147483647
LONG_MAX :2147483647
LLONG_MAX :9223372036854775807
각 데이터 형의 최대값 최소값 정의명
데이터형최대값 최소값
charCHAR_MAXCHAR_MIN
unsigned charUCHAR_MAX0
shortSHRT_MAXSHRT_MIN
unsigned shortUSHRT_MAX0
intINT_MAXINT_MIN
unsigned intUINT_MAX0
long(32bit 환경)LONG_MAXLONG_MIN
unsigned long(32bit 환경)ULONG_MAX0
long(64bit 환경)LONG_MAXLONG_MIN
unsigned long(64bit 환경)ULONG_MAX0
long longLLONG_MAXLLONG_MIN
unsigned long longULLONG_MAX0
참고로 long long int 와 long long이 다른 것인줄 알았는데 long long (int)로 int가 생략한 표현이었습니다.
오늘도 기본을 다집니다.

2019년 8월 9일 금요일

구조체(Struct)혹은 클래스(Class)를 정렬해보자.

백준(BAEKJOON) 2535번 문제를 풀다가 공부하게 된 내용입니다.
https://www.acmicpc.net/problem/2535

접근제어 지시자의 선언이 없는 경우 구조체(Struct)는 pulbic으로, 클래스(Class)의 경우는 private으로 선언된다는 것 외에는 차이가 없으므로 구조체(Struct)로 정리를 합니다.

입력받을 내용을 구조체(Struct)배열에 저장하고, 구조체(Struct)배열을 정렬해보려 합니다.

먼저 구조체를 선언하고, 필요한 만큼 구조체배열을 선언, 구조체 배열에 데이터를 저장, 출력해봅니다.

#include <iostream>
using namespace std;

struct Olympic
{
int country;
int num;
int score;
};

int main(void)
{
int N;
cin >> N;
struct Olympic olympic[N];
int tc,tn,ts;
for(int i=0;i<N;i++)
{
cin >> tc >> tn >> ts;
olympic[i].country=tc;
olympic[i].num=tn;
olympic[i].score=ts;
}
for(int i=0;i<N;i++)
{
cout << olympic[i].country;
cout << ' ';
cout << olympic[i].num;
cout << ' ';
cout << olympic[i].score;
cout << endl;
}
return 0;
}

(입력)

1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195

(출력)
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195

잘 입력되고 출력되었습니다. 이제 Olympic.score로 정렬을 한후 출력을 해봅니다.

먼저 sort() 함수를 이용하려면 algorithm 헤더의 추가가 필요합니다.
sort(A, B) 인경우 A와 B의 범위내에서 "<" 연산결과가 true인 경우 그대로 , false인 경우 해당 요소의 자리를 바꾸며 정렬을 합니다. 기본적으로 오름차순 정렬이 됩니다.

구조체(Struct)를 정렬하는 방법은 크게 두 가지 입니다.

연산자 오버로딩
sort()의 비교기준인 "<" 연산자를 오버로딩합니다. 오버로딩은 구조체(Struct)안에서 처리합니다.
 "<"는 오름차순 정렬이므로 문제풀이를 위해 내림차순 정렬이 되도록 실체 처리는 ">" 연산으로 변경했습니다.

#include <iostream>
#include <algorithm>
using namespace std;

struct Olympic
{
int country;
int num;
int score;
bool operator<(const Olympic &another) const
{
return score > another.score;
};
};

int main(void)
{
int N;
cin >> N;
struct Olympic olympic[N];
int tc,tn,ts;
for(int i=0;i<N;i++)
{
cin >> tc >> tn >> ts;
olympic[i].country=tc;
olympic[i].num=tn;
olympic[i].score=ts;
}
sort(olympic,olympic+N);
for(int i=0;i<N;i++)
{
cout << olympic[i].country;
cout << ' ';
cout << olympic[i].num;
cout << ' ';
cout << olympic[i].score;
cout << endl;
}
return 0;
}

(입력)
9 
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195

(출력)
1 1 230 
1 2 210 
1 3 205 
3 4 195
3 2 190 
3 3 180
3 1 175
2 2 150 
2 1 100 

잘 정렬되었습니다.

compare()함수를 작성
sort()의 비교기준을 "<" 연산자에서 특정함수로 변경가능합니다. 
구조체(Struct)의 "<" 연산자 오버로딩을 삭제하고 compare()함수로 mySort()를 작성, sort()에 지정을 했습니다.

#include <iostream>
#include <algorithm>
using namespace std;

struct Olympic
{
int country;
int num;
int score;
};

bool mySort(Olympic &a, Olympic &b)
{
return a.score > b.score;
}

int main(void)
{
int N;
cin >> N;
struct Olympic olympic[N];
int tc,tn,ts;
for(int i=0;i<N;i++)
{
cin >> tc >> tn >> ts;
olympic[i].country=tc;
olympic[i].num=tn;
olympic[i].score=ts;
}
sort(olympic,olympic+N,mySort);
for(int i=0;i<N;i++)
{
cout << olympic[i].country;
cout << ' ';
cout << olympic[i].num;
cout << ' ';
cout << olympic[i].score;
cout << endl;
}
return 0;
}

(입력)
9 
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195

(출력)
1 1 230 
1 2 210 
1 3 205 
3 4 195
3 2 190 
3 3 180
3 1 175
2 2 150 
2 1 100 

잘 작동합니다.

정렬이 완료되었으니 백준(BAEKJOON) 2535번 문제는 국가에서 최대 2개의 메달만 획득할 수 있다는 룰만 적용해주면 되겠습니다.

1、2、QWER! in OSAKA (大阪 2025/4/10(木) Yogibo META VALLEY)

https://www.creativeman.co.jp/event/qwer-osaka/ QWER - CREATIVEMAN PRODUCTIONS 主催:LIVET 企画:ソニー・ミュージックソリューションズ 招聘:クリエイティブマンプロダクション 制作協力:クリエイテ...