문제 풀이 시 실수했던 내용/주의할 사항들을 정리합니다.
🚨 조건문에서 and/or 연산자 사용시 : 괄호, ! 위치 주의
!((moveTo.first == pacMan.first) && (moveTo.second == pacMan.second))
-> ! 연산자가 조건 전체에 대한 것인지 특정 괄호내에 있는 내용만 해당되는 것인지 주의
🚨 for문 주의 : 초기값 지정하는 첫 루프를 돌때도 조건식 확인함
→ 아래 코드는 아무것도 출력되지 않음
for(int i=10;i<10;i++){
cout << i << "\n";
}
구조체 배열(메모리풀) 초기화시 함부로 0으로 채우지 않기
ex) memset(pool, 0, sizeof(dir) * n);
**🚨 vector에서 erase 함수 + for 문 쓸 때 주의**
ex) vector<int> array;
1 | 2 | 3 | 4 | 5 |
---|
1,2,3 지우기
for (auto it = array.begin(); it != array.end(); it++) {
if (*it < 4) {
array.erase(it);
}
}
for(int i : array){
cout << i <<" ";
}
💻 2 4 5
∵ 1 지우고 iterator는 2를 가리키는데 ++하면 3 가리킴
+) iterator로 순회하는 중에 erase 하면 꼬임
it = array.erase(it)
이런식으로 재할당 해주는 방식으로 부분적으로 해결 가능(항상 해결되는 것x)
🚨 ”동시에 일어난다” vs “순차적으로 일어난다” 구분
동시에 일어난다면 임시 배열 만들어서 처리
ex)
🚨 차례대로 업데이트할 때 방향 주의
ex) 인덱스 1→2→3→4→5 순서대로 업데이트시 인덱스 1에 있는 내용이 5까지 따라 올라갈 수 있음 ⇒ 이 경우 5→…→1 순서로 업데이트
🚨 연결리스트 통째로 옮기는 경우 : 기존 위치의 head, tail 끼리 연결 필요
(옮기는 도착지점 연결은 하고 기존 위치 head-tail끼리의 연결 까먹음..)
🚨 2차원 배열 중 가장 큰﹒작은 값 찾을 때 : 기준값 설정 주의
ex) 배열에 요소들 값 : 0~
초기 기준값 ≠ 0, 배열에 있을 수 없는 값으로 초기값을 두고 최대(최소)값 찾기
int calcFriends(pair<int, int> loc, bool *likes) {
// 기준값 (0,0)이 로직상 맞는지도 유의!!
// 최댓값 구할 때 - (0,0)이 아예 불가능 한 값인데 모든 가능한 값들보다 (0,0)에 있는 값이 큰 경우
if ((loc.first == -1) && (loc.second == -1)) {
return -1;
}
// 상하좌우
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
int ret = 0;
for (int d = 0; d < 4; d++) {
int nr = loc.first + dr[d];
int nc = loc.second + dc[d];
if ((0 <= nr) && (nr < n) && (0 <= nc) && (nc < n)) {
if (likes[rides[nr][nc]]) {
ret++;
}
}
}
return ret;
}
🚨 메모리풀 사용시 크기 충분히 크게 두기!
🚨 방향 입력 받을 때 for문 인덱스 변수와 for문 내의 변수 이름이 같지 않도록 주의!
ex)
int d; //!!
...
for (int i = 1; i <= players; i++) {
for (int d = 0; d < 4; d++) { //!!
for (int pr = 0; pr < 4; pr++) {
cin >> d; //!!
}
}
}
🚨 unordered_map, vector 초기화
vector의 각 요소(unordered_map) 초기화 → vector 초기화
vector<unordered_map<int,int> > vec =
vector<unordered_map<int,int> >(10, unordered_map<int,int>());
for(int i=0;i<TEAM_MAX;i++){
vec[i].clear();
}
vec.clear();