일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- dynamic_cast
- increment operator
- c++ basic practice
- virtual inheritance
- std::vector
- 더 지니어스 양면포커
- delete function
- conversion constructor
- vector capacity
- constructor
- c++ multi chatting room
- std::cout
- placement new
- std::endl
- this call
- virtual function
- vector size
- operator overloading
- discord bot
- diamond inheritance
- virtual destructor
- std::ostream
- member function pointer
- virtual function table
- return by reference
- new&delete
- pointer to member data
- C++
- suffix return type
- base from member
- Today
- Total
목록Algorithm (9)
I'm FanJae.
1. 문제 링크https://www.acmicpc.net/problem/3015 2. 문제 접근- 왼쪽에서 오른쪽으로 볼 때, A와 B가 서로 볼 수 있으려면 A 또는 B보다 키가 큰 사람이 없어야 한다.- 2 4 1 2 2 5 1이면 다음과 같다.- (2,4) (4,1) (4,2) (4,2) (4,5) (1,2) (2,2) (2,5) (2,5) (5,1)- 어떤 수(왼쪽 수) 입장에서 자신보다 큰 수가 등장했다는 것은 해당 인원들은 더 이상 쌍을 만들 수 없다. - 그 수를 기준으로 모두 pop()한다. pop()한 개수 만큼 더해준다. (pop된 수와 쌍을 만들 수 있음.)- 오른쪽 수의 입장에서 왼쪽수가 자신보다 크다면, 적어도 왼쪽에 있는 수 중에는 쌍을 만들 수 있는건 1개다.- 같은 수일때는 ..
1. 문제 링크https://www.acmicpc.net/problem/17298 2. 문제 접근- 왼쪽에서 오른쪽으로 볼때, 자신보다 큰 수 중에서 가장 가까운(왼쪽에 있는 수)를 구하면 된다.- 어떤 수를 기준으로 자신보다 큰 수가 등장했다는 건 그 수의 정답이 확정된다.- 즉, 큰 값이 나타날때까지 stack에 넣어주고 대기한다. 자신보다 큰 수가 등장하면 그 수가 정답이 된다.- 3을 처음 넣을때는 아무것도 없으므로, 바로 넣어준다. 이후 들어오는 값인 5는 스택에 있던 값인 3보다 크므로 오큰수다.- 이에 따라서, 3을 빼주고, 3에 대한 오큰수는 5임을 알 수 있다. - 2의 경우는 5에 대한 오큰수가 될 수 없기 때문에 그대로 넣는다.- 마지막으로 들어오는 7은 2보다 크기 때문에 2의 오큰..
1. 문제 링크https://www.acmicpc.net/problem/6198 2. 문제 접근- 개인적으로 문제는 Stack으로 풀면 쉽게 풀리는 것을 깨닫기가 어렵다.- Stack까지 생각해냈다면, 그 뒤에는 Stack의 특징을 잘 이용해서 풀 수 있다.- 왼쪽 건물에서 오른쪽 건물을 볼 수 있으려면 반드시 빌딩의 높이가 더 낮아야 한다.- 즉, 오른쪽 건물 중에 자신보다 높은 건물이 하나 등장하면, 이 건물이 더 이상 확인 가능한 건물은 없다.- 이를 잘 이용하면 stack을 이용해서 풀 수 있다. - 처음 10을 넣을때는 바로 넣는다. 3을 넣을때는 3이 10보다 작다. - 즉, 10의 관점에서는 3을 볼 수 있기 때문에 값을 1증가한다.- 7을 넣을때는 7이 3보다 크기 때문에, 3을 빼내고 ..
1. 문제 링크https://www.acmicpc.net/problem/2493 2. 문제 접근- 특정 i번째 탑은 레이저 수신을 위해서는 i-j (j 해야 한다.- 자신보다 높은 탑을 찾는 과정에서 존재하는 낮은 탑은 관심 없다.- 즉, 자신이 왼쪽으로 쏘는 시점에서 높이가 높은 탑이 있으면 해당 탑에 레이저를 쏴야하고, 없으면 쏠 대상이 없다. - 6은 아무것도 없기 때문에 레이저를 쏠 대상이 없다.- 9는 6보다 크기 때문에 6으로 레이저를 쏘는 것이 불가능하다.※ 이 시점에서, 6을 빼도 되는 이유는 6보다 높이가 더 큰 9가 오른쪽에서 왼쪽으로 쏠 모든 레이저를 받아내기 때문이다. - 5는 9를 향해 레이저를 발사할 수 있다. 하지만 7은 5에게 레이저를 발사할 수 없다.- 따라서 자신보다 낮은..
1. 문제 링크https://www.acmicpc.net/problem/1874 2. 문제 접근- 특정 수가 나오기 위해서는 우선, 그 수보다 작은 값이 먼저 등장해야한다.- 예를들어, 5라는 숫자가 나오기 위해서는 1,2,3,4가 먼저 등장해야 한다. (이미 나간 경우를 포함한다.)- 다음 나와야 할 값을 기록해서, 입력받은 수보다 작으면 계속 스택에 넣어준다. - 위와 같은 형태를 띈다.- 이때, 스택의 꼭대기 값을 확인해서 같은 값이면 뺀다. - 만약 같은 값이 아닌 경우, 연산이 불가능한 상황이므로, 이를 처리해주면 된다. 3. 문제 풀이- 현재 들어가야 하는 값과 입력 받은 값을 비교한다.- 만약 입력 받은 값이 더 크다면, stack에 입력 받은 값까지 push한다.- 이후, 스택에 top ..
1. 문제 링크https://www.acmicpc.net/problem/10773 2. 문제 접근- 0이 들어오면 가장 최근에 쓴 수를 지우는게 핵심인 스택을 사용할 수 있으면 어렵지 않게 풀이를 연상할 수 있는 문제다. 3. 문제 풀이- stack에 각 수를 넣는다.- 0이 들어오면 stack에 있는 꼭대기 값을 버린다.- n 만큼의 입력이 모두 끝나면, 그 값을 합산해주면 정답이 된다. 4. 소스 코드(C++)더보기#include #include using namespace std;int main(void){ int n; long long int answer = 0; stack value; ios::sync_with_stdio(false); cin.tie(NULL); cin >> n; while (..
1. 문제 링크https://www.acmicpc.net/problem/1158 2. 문제 접근- 문제를 이해하는 것은 어렵지 않다. - 처음에 모든 인원을 삽입해주고, 중간 삭제를 위해서 list 등을 이용한 처리가 적합하다. 3. 문제 풀이- std::list를 이용해서 전체를 모두 넣어준다.- list에 대한 iterator를 순환 시켜서 계속 돌린다. - 이후, k번째에 해당하는 경우 삭제하고, 아닌 경우 다음 사람으로 넘어간다. (iterator값 증가)- 유의할 점은, 삭제된 이후 시점에 가리키는 요소나 다음 사람으로 넘어갈때 요소가 끝인 경우 처음으로 되돌린다. 4. 소스 코드(C++)더보기더보기#include #include using namespace std;int main(void){ ..
1. 문제 링크https://www.acmicpc.net/problem/5397 2. 문제 접근- 이 문제의 핵심은 키로거에서 화살표나 백스페이스 등의 처리가 중요하다.- 화살표 처리와 백스페이스 처리상 중간 삽입 / 삭제가 자유로워야 하기 때문에 list 등을 이용한 처리가 적합하다. 3. 문제 풀이 - 1406번 문제와 풀이 방법은 거의 같다.- std::list와 list에 대한 iterator를 하나 선언한다.- '맨 앞이 아닐때, iterator를 감소시킨다.- '>'인 경우, 맨 끝이 아닐때, iteartor를 증가시킨다. - '-'인 경우, 백스페이스(바로 왼쪽에 있는 값)을 제거해야 하기 때문에 iterator를 감소 시키고, 제거해야 한다. - ABC라는 문자가 있다면, ABC라는 문자가..
1. 문제 링크https://www.acmicpc.net/problem/1406 2. 문제 접근- 이 문제의 핵심은 cursor에 있다.- cursor 처리를 어떻게 하느냐가 매우 중요하다. 3. 문제 풀이- 본인의 경우, 초기 편집기에 입력되어 있는 문자열을 char로 std::list에 넣었다.- 그 다음에 cursor에 대한 iterator를 이동시키는 방식으로 구현했다.- 문제의 요구사항에 따라서 커서가 맨 앞인가 맨 뒤인가에 따라서 예외 처리를 잘해주는 것이 중요하다.- 삽입과 삭제에 대해서 각각 유의할 점이 존재한다.- 삽입의 경우는 iterator의 바로 앞에 요소를 추가한다는 점이다.- 이와 다르게 삭제는 커서 왼쪽에 있는 문자를 삭제 해야 하기에 이동을 시켜줘야 한다.- erase의 반환..