![[C++] std::vector resize와 reserve의 차이점](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw6Kpv%2FbtsNMSyVFdj%2F0JtMAR0DUgLnhi5xCcYq20%2Fimg.png)
STL의 대표 컨테이너인 vector의 resize와 reserve의 차이점을 알아보도록 하자.resize는 코테 공부를 할 때 정말 많이 사용했었는데 reserve는 가끔만 사용했었는데 둘의 차이점이 있다는 점정도만 알고 넘어가다가 도저히 안될거같아서 정리한 글이다...ㅠ 우선 vector자체는 가변배열이다. 데이터를 push_back하다가 보면 현재 동적할당받은 크기를 넘어서는 순간 다시 현재 사이즈 보다 더큰 배열을 동적할당하여 데이터를 새로 동적할당한 곳으로 복사한다. 이렇게 동적할당하고 복사하고~ 이런 과정의 비용이 비싸기 때문에 동적할당을 한번만 수행하여 비용을 낮추는데 주로 사용되는 vector의 멤버 변수가 두가지가 있다. 바로 resize, reserve이다. (동적할당이 어떻게 발생하고..
![[백준] 1182 부분수열의 합 C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvHuNI%2FbtsNLBkhlLo%2Fd5sWRVqvzKfxuWKkl6AX4K%2Fimg.png)
https://www.acmicpc.net/problem/1182 우선 부분수열의 개념부터 보도록 하자. 부분 수열이란? ' 부분수열은 주어진 수열에서 일부 또는 전체 원소를 원래 순서대로 뽑아 만든 새로운 수열을 말합니다.'{a, b, c}라는 집합에서 부분 수열은 {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c} 공집합 이렇게 된다. {b, a}는 부분 수열이 아니다. 순서대로 뽑지 않았기 때문이다. 그럼 이제 문제를 어떻게 풀지 접근해보도록 하자.{1, 2, 3} 이있을 때 4를 만족하는 부분 수열의 개수를 구하기 위해서 {1, 3}을 뽑으면 된다는 것을 직관적으로 알 수 있는데 이를 코드로 나타내기 위해서는 '백트래킹'이 필요하다. (n이 20이기 때문에 비트..
![[백준] 인구이동 16234 C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRy4SZ%2FbtsNB5NO2Hd%2FIVLimLhSfKKo3kb5CmHnk0%2Fimg.png)
https://www.acmicpc.net/problem/16234 해설인구이동 문제이다.핵심은 인접한 마을의 인구수가 L보다 크거나 같고 R보다 작거나 같으면 이동이 가능하다고 판단하고 인구이동을 시키는것이다. Connected Component를 구하는 문제이다. 이동이 가능하다는 것의 판단은 인접한 두 마을 사이의 인구차이 값에 절대값을 취해서 판단해주면 된다.문제는 n*n짜리 보드(배열)에서 '어떻게' 이동이 가능한 마을을 '묶어서' 처리하냐는 것이다. 본인 처음에 dfs나 bfs로 탐색하여 unoin find?나 그룹화할 또 다른 배열을 만들어서 같은 번호의 그룹끼리 합을 더하고 평균을 내서 원본 board배열에 값을 갱신하는 아이디어를 생각했는데 이 보다 간단한 방법이 있다. '묶어서' 처리한..

class A{public: int hp = 0;};int main(){ A* a = new A(); delete a; a->hp = 200;}위 코드를 보자 분명 delete를 하고 a = nullptr로 밀어준다음에 nullptr확인을 안하고 해제된 메모리에 값을 쓰고 있다.분명히 잘못된 코드인데 때에 따라서 크래쉬가 날 수도 있고 안 날 수도 있다. delete키워드가 소멸자를 호출해주고 메모리를 해제하는 것은 맞지만 메모리 해제를 바로 os에게 요청하지 않기때문이다.delete는 객체가 차지했던 메모리 블록을 힙에 반환한다. 여기서 중요한 부분은 메모리 블록을 운영체제에게 즉시 반환하는게 아니라 힙 관리에게 반환한다는 것이다.힙 관리자는 반환된 메모리 블록을 재사용가능한 공간으로 관리한다. 따라서..

스핀락스핀락은 스핀락은 임계 영역(critical section)에 접근하기 위해 락을 획득할 때까지 CPU를 멈추지 않고 계속 루프를 돌면서 대기하는 방식의 동기화 기법이다. 장점으로는 '컨텍스트 스위칭이 발생하는 다른 동기화 기법보다 오버헤드가 낮다.'단점으로는 '다수의 쓰레드가 경쟁할 경우, CPU 사용률이 급격히 증가할 수 있다.' 스핀락기법을 사용할 때 컨텍스트 스위칭 비용이 다른 동기화 기법들 보다 낮은 이유는 System Call 호출을 통해 커널 모드로의 전환이 발생하지 않기 때문이다. 예로 this_thread::sleep_for(std::chrono::milliseconds(100)); 를 호출하게 되면 쓰레드는 '커널 모드'로의 전환이 발생한다.OS는 현재 쓰레드를 대기 목록에 추가하..
![[C++] 다형성과 가상 소멸자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWB2bS%2FbtsMUrxouUA%2F6Lqw6AbYE9q31kYQ6JsTy1%2Fimg.png)
C++은 객체 지향 프로그래밍 언어이다.OOP의 속성으로는 은닉화, 캡슐화, 상속성, 다형성이 있고 OOP의 특성으로는 추상화가 있다.이중에서도 다형성은 쉽게 말하면 '모습은 같은데 형태는 다른 것'을 의미한다.상속관계에서 다형성이 활용되는데 주의해야할 것들 중 이번 글은 '가상 소멸자'에 대한 부분이다. parent* p = new child();우리는 위처럼 '업캐스팅'을 자주 사용할 때가 많다. 위 코드를 컴퓨터 입장에서 보면 부모 클래스 포인터로 무엇인가 가르키고 있기 때문에 가르키는 대상이 무조건 부모 클래스 객체라고 생각할 수 밖에 없다.(원하는 동작은 parent*로 가르키고 있지만 실 객체는 child라고 인식 시키고 싶은 것이다) 위 코드는 child클래스가 parent클래스로 부터 함수..
![[백준] 2852 NBA 농구 C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2d84A%2FbtsMI6UmiAd%2Fusep3HAmd9thcd0qUHNTKk%2Fimg.png)
https://www.acmicpc.net/problem/2852풀이 농구 골 넣는 문제이다.포인트는 '분 -> 초'로 단위로 단위 통일 인듯하다. 분끼리 계산 & 초끼리 계산하면 복잡하기 때문에 단위를 통일해주고이긴 시간을 누적해주어야 하기 때문에 prev라는 변수를 통해 이전에 골을 넣은 시간을 추적해준다.그리고 분 & 초를 초단위로 변경 및 출력하기 위해 substr를 사용해주도록 하자. 1. 초로 단위 통일2. 이긴 팀 변수 증가3. 골을 넣은 시간(prev)로 추적4. 이긴 팀의 시간을 계산하여 누적5. substr로 출력 코드#includeusing namespace std;#define endl '\n'using ll = long long;#define prev ppp1#define visi..
![[백준] 3474 교수가 된 현우 C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFcFA%2FbtsMI5HI00o%2Fl0R7bN3tFonTa4MnE3kRD1%2Fimg.png)
https://www.acmicpc.net/problem/3474 접근 아이디어적인 문제라고 생각한다. 안 풀어 보면 맞추기 힘들거 같은...우선 5600에서 0의 개수를 구해야한다. 지금은 2개라는 것을 알 수 있는데 한번 쪼개보자.5600 = 56 * 10 * 10 = 56 * (2 * 5) * (2 * 5)이다.5600에서 0의 개수는 10의 개수에 따라 결정이 된다는 것을 알 수 있고 10의 개수는 2와 5의 개수로 결정이 된다는 것을 알 수 있다.어떤 수 n에서 2의 개수가 7개 5의 개수가 3개라면 10은 3개가 나오게 된다. 7, 3 중에 최소값이 10의 개수가 된다. 5!을 예로 들면 1 2 3 4 5에서 2의 배수의 개수는 5 / 2 => 2개, 5의 배수의 개수는 5 / 5 => 1개 ..