[C++] 유용한 것들

kodaaa·2022년 7월 3일
0

코딩테스트

목록 보기
8/17
post-thumbnail

여러 유용한 것들

📌 typedef

자료형에 새롭게 이름을 붙일 때

typedef long long ll; //long long 대신 ll으로 자료형 사용 가능

📌 전역변수 초기화

  • 전역변수를 선언하고 직접 초기화하지 않으면 자동으로 초기화됨
    • int a; : 0으로 자동 초기화
    • bool a; : false(0)으로 자동 초기화
    • 프로그래머스에서는 전역변수 선언시 꼭 초기화하라는 문구가 나옴 이제는 그냥 초기화되는듯
  • 배열 초기화
    • bool arr[10] = {false}; : arr의 모든 원소를 false로 초기화
      • bool arr[10]; 도 동일
    • int arr[10] = {0}; : arr의 모든 원소를 0으로 초기화
      • int arr[10]; 도 동일
      • cf. int arr[10] = {-1}; : 맨 처음 원소만 -1, 나머진 0으로 초기화됨

📌 지역변수 초기화

for문을 통한 배열 초기화보다 빠르다

  • memset : 0으로 초기화만 가능
    • 배열
      #include <memory.h>
      /* 1차원 배열 */
       memset(arr, 0, sizeof(arr)); //memset(배열시작점/배열이름, 초기화할값,sizeof(배열이름));
       
     /* 2차원 배열 */
     for(int i=0; i<10; i++){ //i는 행의 범위
     	memset(arr[i], 0, sizeof(int)*10); //모든 값 0으로 초기화
        //sizeof(int)*10에서 10은 열의 크기 
     }
  • fill
    • 벡터

      • 1차원 벡터
      #include <algorithm>
      
      vector<int> v;
      v.resize(10); //v 크기 설정 후에
      
      fill(v.begin(), v.end(), 0); // 전체 초기화
      • 2차원 벡터
      #include <algorithm>
      
      vector<vector<int>> v(5, vector<int>(5));
      
      v.resize(10, vector<int>(10, 0)); //v 크기 설정 후에
      
      // 전체를 0으로 초기화
      // 5개의 0으로 채워져있는 벡터(열)를 행에 채워넣는다
      fill(v.begin(), v.end(), vector<int>(5,0);
    • 배열

      • 1차원 배열
      #include <algorithm>
      
      int arr[10];
      // arr[0]~arr[9]를 0으로 초기화
      fill(arr, arr+10, 0);
      • 2차원 배열
      #include <algorithm>
      
      int arr[10][10];
      // 전체 초기화 : arr[0][0]~arr[9][9]를 0으로 초기화
      fill(&arr[0][0], &arr[10-1][10], 0);

📌 자료형의 최소/최댓값

#include <climits>

int minInt = INT_MIN; //int의 최솟값
int maxInt = INT_MAX; //int의 최댓값
long maxLong = LONG_MAX; //long의 최댓값
long long maxLongLong = LLONG_MAX; //long long의 최댓값

📌 pair(first, second)

pair<int,int> mypair = make_pair(2, 5); //make_pair함수로 생성
cout << mypair.first; //2
cout << mypair.second; //5 //값을 리턴
mypair.first = 7;
mypair.second = 3; //값에 접근해서 수정 가능
  • 벡터의 자료형으로 쓰일 수도 있음
  vector< pair<int,int> > list(3); //pair형 벡터
  list.emplace_back(make_pair(2,5)); //(2,5)를 벡터에 할당
  cout << list[0].first << '\n'; //2 출력
  cout << list[0].second << '\n'; //5 출력
  • 타입으로 직접 정의해서 쓸 수도 있음
  typedef pair<int, int> P; //타입으로 직접 정의해서 쓸 수도 있음
  
  priority_queue< P, vector<P>, greater<P> > Q; //최소부터 pop하는 우선순위 큐
  Q.push(P(5,4)); //Q.push(make_pair(5,4));와 같음
  Q.push(P(2,5));
  Q.pop(); //P(2,5)가 pop
  // ** (first, second)형 우선순위 큐에서는 먼저 first를 기준으로 비교하고, 만약 first가 같은 경우에는 second를 비교함 **

📌 범위 기반 for문

for문을 통해 배열, string, vector, list, set, map의 요소에 접근할 때 사용

1. 배열 요소에 대한 참조로 접근

int myArr[] = {1,2,3,4,5};
for(auto &element : myArr){
  cout << element << ' ';
}
//element는 myArr배열의 원소를 차례대로 참조함
//element를 수정하면 배열의 요소에 영향을 미친다
//이름이 꼭 element가 아니여도 됨(아무거나 가능)
  • 읽기 전용으로 사용하려는 경우 : element를 const로 만드는 것이 좋다
  int myArr[] = {1,2,3,4,5};
  for(const auto &element : myArr){
    cout << element << ' ';
  }

2. 배열 요소를 복사해서 접근

int myArr[] = {1,2,3,4,5};
for(auto element : myArr){ 
  cout << element << ' ';
}
//myArr배열의 원소값이 차례대로 element에 '복사'됨
//element는 배열 요소와 자료형이 같아야 함 -> auto 키워드를 사용하면 C++이자동으로 자료형을 추론함
  • 배열 요소를 복사하는 것은 비용이 클 수 있음 -> 참조를 사용하는게 좋다

💡 포인터로 변환된 배열, 동적 배열에서는 사용 불가(배열의 크기를 알지 못하기 때문)

int sumArray(int array[]) // array is a pointer
{
  int sum = 0; 
  for(const auto& number : array){ // compile error
    sum += number; return sum; 
  }
}

int main() 
{ 
  int array[5] = { 9, 7, 5, 3, 1 };
  std::cout << sumArray(array); // array decays into a pointer here  
}

📌 정렬-sort함수

  • 배열, 벡터의 원소들을 정렬해줌

  • quick sort(퀵정렬) 기반으로 구현되어있음

  • 원소가 pair<자료형1, 자료형2> 형식일 땐, 첫번째 요소를 기준으로 먼저 정렬하고, 첫번째 요소가 같은 경우에는 두번째 요소를 기준으로 비교함

  • 평균 시간복잡도 : O(nlogn)

    #include <algorithm> //algorithm 헤더파일
    using namespace std; //std 소속
    
    //void sort(첫번째주소, 마지막주소, 정렬형태);
    //정렬형태 매개변수는 없어도 됨(defalut는 오름차순)
    
    //배열 arr의 0번째~n-1번째 원소까지 오름차순 정렬
    //배열 시작~끝까지 정렬하려면 arr, arr+배열크기
    sort(arr, arr+n);
    
    //벡터 v의 처음부터 끝 원소까지 오름차순 정렬
    sort(v.begin(), v.end());
    
    //사용자 정의 함수 compare 대로 정렬
    sort(v.begin(), v.end(), compare);
    
    //내림차순 정렬 : greater가 내림차순인거 주의!!! 우선순위 큐랑 다름
    sort(v.begin(), v.end(), greater<자료형>());

1. 배열

  • 숫자를 오름차순으로 정렬
     #include <iostream>
     #include <algorithm>
     using namespace std;
     
     int main()
     {
         int arr[5] = {3,2,4,5,1};
         sort(arr, arr+5); 
         //index 0 ~ index 4까지 오름차순 정렬
         //첫번째 매개변수값~두번째 매개변수값 이전까지
         //결과 : {1,2,3,4,5}
     }
  • 문자열을 내림차순으로 정렬
     #include <iostream>
     #include <algorithm>
     #include <string>
     using namespace std;
     
     bool compare(string s1, string s2)
     {
         return s1 > s2; 
         //s1이 s2보다 사전순으로 더 뒤면 true 리턴
         //string은 비교연산자를 통해 사전식 비교 가능
     }
     
     int main()
     {
         string arr[5] = {"abc", "aa", "abcd", "aza", "bcda"};
         sort(arr, arr+5, compare); //arr[0]~arr[4]를 사전역순(내림차순)으로 정렬
     }

2. 벡터

      #include <algorithm>
      #include <vector>
      using namespace std;
      
      sort(v.begin(), v.end()); //벡터의 원소 전체를 오름차순 정렬
      sort(v.begin(), v.end(), compare) //사용자 정의함수 사용
      sort(v.begin(), v.end(), greater<자료형>()); //내림차순 정렬
      sort(v.begin(), v.begin()+4, less<자료형>()); //v[0]~v[3]까지 오름차순 정렬

📌 게임 이론

  • 경우의 수가 아주 많은 게임의 경우 규칙이 있을 수 있다
  • 이 규칙은 우선 작은 범위 내에서 코드를 짜서 돌려보면 찾을 수 있다
  • 예시 - 백준 9660번

📌 배열 자동 채움

  • 전역변수로 선언하면 선언만으로 배열 내용이 자동으로 채워진다.

    • int형은 0으로
        int arr[7]; //{0,0,0,0,0,0,0}
    • bool형은 false로
        bool arr[3]; //{false,false,false}
  • 지역변수로 선언하면 선언만으로 배열 내용이 자동으로 채워지지 않는다.

      int main()
      {
        int arr[7]; //직접 채워야함
        bool arr[3]; //직접 채워야함
        bool arr[3] = {true,}; //{true, false, false}
      }

📌 두 변수값 중 최대, 최소 반환

#include <algorithm>

int a = 3, b = 5, min, max;
min = min(a, b); //min=3
max = max(a, b); //max=5
  • 세 개 이상의 값을 비교하려면 두개씩 비교

📌 나머지 연산 분배법칙

(A + B) % p = ((A % p) + (B % p)) % p
(A * B) % p = ((A % p) * (B % p)) % p
(A - B) % p = ((A % p) - (B % p) + p) % p
  • 각 수를 나머지 연산하고 더한 것을 한 번 더 나머지 연산 해야 함!!!
  • 나머지끼리 더해서 다시 나누어떨어질 수도 있기 때문
  • 여러 결과를 더한 최종 결과값을 나머지 연산한 값을 구하는 경우, 각 결과에 대해 맨 처음 규칙을 쓸 수 있을 듯 : 정수형에 대한 오버플로우를 막기 위함
    • 백준 2225번

📌 절대값 함수

#include <iostream>
#include <cmath>

//사용법
int abs(int n);
long labs(long n);
double fabs(double n);

//예시
int x = -3;
int a = abs(x); //a=3
profile
취뽀하자(●'◡'●)💕

0개의 댓글