반응형
💡 3차원 벡터 정의
vector<vector<vector<int>>> arr

 

 

💡 3차원 벡터 resize() 함수 사용
//n,m,h

arr.resize(n, vector<vector<int>>(m, vector<int>(h)));

 

 

💡 쌍 pair
queue<pair<pair<int,int>, int>> q;
반응형
반응형
💡 map
  • map 자료구조는 <키, 값>의 쌍으로 이루어진 자료형이다.
  • map<int, int> m 으로 키와 값이 모두 int 타입인 map 자료구조를 하나 생성하였다고 가정하자.
  • map은 키를 마치 인덱스처럼 사용할 수 있다.
  • map[-1]은 키가 -1인 요소의 값을 리턴하게 된다.
  • 만약 키값이 map에 존재하지 않은 새로운 값이라면, map[1]++ 을 했을 때 map에는 키가 1인 요소가 생성되고, 값은 0으로 자동 초기화 된다. 그리고 ++ 증가 연산자를 사용했기 때문에, map[1]은 1의 값을 갖게 된다.
  • 따라서 map의 경우 insert로 값을 직접 넣지 않고도, map[키]=값 으로써 요소를 추가할 수 있다.  

 

반응형
반응형
💡 printf문에서 소수점 이하 n째자리수 까지 출력하는 방법
float grade, sum;
//grade, sum 초기화

printf("%.6lf", grade / sum);
//grade/sum을 소수점 이하 6자리까지 출력한다
//이때 lf로 쓴다

 

  • 여기서 %lf는 double 형식의 변수를 출력하라는 의미이다.
반응형
반응형

소프티어 lv2 "금고 털이" 문제 풀이 중 pair vector와 sort사용이 익숙치 않아 정리하는 글이다.

 

pair vector
vector<pair<int, int>> v;

vector에서는 한 요소에 두가지 값을 함께 넣으려면, 위와 같이 pair로 묶어서 정의해 주어야 한다.

"금고 털이" 문제에서 첫번째 int 요소에는 금속의 무게를 , 두번째 int 요소에는 금속의 가치를 저장해주었다.

각각의 값에 접근하려면, v.first, v.second로 접근할 수 있다.

 

sort

algorithm에서 정의한 정렬 함수 sort이다.

기본적으로 오름차순 정렬이고, pair vector의 경우 첫번째 값을 기준으로 오름차순 한다.

sort(v.begin(), v.end());

이렇게 하면 vector v를 첫번째 값인 금속 무게에 대해서 오름차순 정렬해준다.

 

그런데 나는 금속의 가치인 두번째 값에 대해서 내림차순 정렬하고 싶었다.

그래서 sort함수에, 따로 정의한 비교함수를 인자로 넣어, 이 기준으로 정렬해 주세요~라고 요청했다.

bool compare(const pair<int, int> &a, const pair<int, int> &b){
	return a.second>b.second;
}

 위와 같은 compare 함수를 정의해 주었다.

내가 헷갈렸던 점은, 부등호의 방향이다. 

처음에는 b쪽에 크다고 했는데, 이유는 정렬할 때 뒤에 있던게 컸었다..라고 생각한 것이다. 아무튼 나의 착각이고..

내림차순이 앞이 큰거니까, 먼저 위치한 a가 클 때 true로 정의해 주는 것이다.

반대로 오름차순이면? b쪽으로 부등호가 향해야 할 것이다.

 

이렇게 해서 기본 of 기본인 pair vector와 sort함수에 대해 정리해보았다.

다음에는 버벅거리지 않고 바로 구현하길~

반응형
반응형

소프티어의 "성적 평균" 문제를 풀다가 "평균을 소수점 셋째 자리에서 반올림하여 표시" 하도록 요구되어 있었다.

printf에서는 "%.2f"엿던가..? 

 

c++에서 iomanip 헤더에 있는 setprecision을 사용하면 소수점 반올림이 가능하다.

 

cout으로 출력을 낼 때는 다음 두가지 경우로 나누어 표현할 수 있다 

 

✔ fixed를 안붙이는 경우

double a = 3.1415
cout<<setprecision(3)<<a<<endl;

//출력 : 3.14

fixed의 역할은 고정 소수점 표기를 해주는 것인데, 위처럼 fixed를 쓰지 않으면, setprecision(3)에 의해서 3번째 자리수에서 반 올림하고, 3.14로 출력된다.

만약 a가 3.000이었다면, 소수점이하의 값은 날라가서 3으로 출력된다.

 

✔ fixed를 붙이는 경우

double a = 3.1415
cout<<fixed<<setprecision(3)<<a<<endl;
//출력 : 3.142

 fixed를 붙이면 3번 째 자리까지 반올림 된 값이 출력이 된다.

 

따라서 문제에서는 3번째 자리에서 반올림하여 둘째 자리까지 표시되도록 (3.00) 하였으므로, fixed를 붙이고 setprecision(2)로 하여 출력하였다.

 

 

반응형
반응형

소프티어의 "성적 평균" 문제를 풀다가 사용했던 2차원 배열 동적 할당에서 어이없는 오류를 냈다.

기본 of 기본인데.. 이 참에 한번 짚고 넘어간다!

 

✅ 배열 동적 할당

✔ 1차원 배열을 동적 할당 시

//int 배열을 받는다고 가정하겠습니다.
int N=100;
int *arr = new int[N];
//크기가 100인 int타입의 배열을 동적 할당해주었습니다. arr이라는 이름으로요.

✔ 2차원 배열을 동적 할당 시

//동일하게 int 타입의 배열을 생성하겠습니다.
int N = 100;
int **arr = new int*[N];
//1차원과 다른 점은 바로 이 부분입니다. arr을 2차원으로 생성한다면, 먼저 1차원 포인터 배열을 가리키도록 해야겠죠?

for(int i=0; i<N; i++){
	arr[i] = new int[N];//그리고 각각의 1차원 포인터에 크기가 N인 배열을 가리키도록 해주어야 2차원 형태가 됩니다.
}

 

어떤 실수를 했었냐면, **arr = new int[N][N]; 이렇게 해버린 것이다.. 뒤에 [N][N]은 정적 배열을 생성할 때 하는 것인데.. 이런 실수를 더이상 하지말자!!!!!

 

 

반응형

+ Recent posts