한 개념을 가지고 여러 가지 문제를 풀어보는 게 확실히 공부하기엔 쉬운 것 같습니다. 16일 차인 오늘도 열심히 해보겠습니다!
문제 설명
연속된 수를 container 안에 넣어두고 이를 문제의 규칙에 맞게 나열해 출력하는 문제입니다.
생각 흐름
우선, 요즘 스택, 큐에 대한 문제를 풀고 있기 때문에 스택 큐에 대해서 제일 먼저 생각났던 것 같습니다.
이 문제는 연속된 수를 넣어두고 문제의 규칙대로 제일 위쪽의 카드에 접근한다는 점에서..
앞 뒤로 접근이 가능한 '큐'를 사용하는 문제라는 점을 빠르게 캐치했던 것 같습니다.
먼저 카드의 개수 n을 받아와 이를 반복문을 돌려 queue <int> q에 하나씩 저장해 주었습니다.
그러고 나서 메모장을 켜고 일일이 손으로 쳐가면서 문제의 규칙에 대해 알아보았습니다.
문제에서는 마지막에 남은 수와 함께 버려지는 수를 출력하라고 했으므로 마지막에 1개의 수가 남겠다는 생각을 하였고
이를 조건문으로 만들어 while 문을 작성해 주었습니다.
q.size()가 1이 안되었다면 계속 반복하며 q.front()에 접근해 삭제, 추가 등을 하며 문제를 마무리하였습니다.
항상 문제를 풀 때 디버깅을 해보는데, 오류에 당황하지 않고 차분히 코드를 다시 돌아보는 것도 중요한 것 같습니다.
이번 문제는 쉽게 생각했으나 잘못 쓰인 코드를 찾지 못해 2번이나 틀렸으니 말이죠 ㅎ..
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main () {
int n; // 카드의 개수 n
cin >> n;
queue <int> q; // 숫자를 넣을 큐 선언 q
vector <int> rest; // 버리는 숫자를 담은 벡터 rest
for (int i = 1; i <= n; i++) {
q.push(i);
}
while (q.size() != 1) {
rest.push_back(q.front());
q.pop();
q.push(q.front());
q.pop();
}
for (auto i : rest) {
cout << i << " ";
}
cout << q.front() << "\n";
return 0;
}
공부한 내용 정리
이번 문제는 큐의 특성을 알고 있었다면 쉽게 풀 수 있었던 문제였습니다.
따로 공부할 게 없어 보여서 다른 사람들의 코드를 한번 찾아보며 저의 코드와 비교해 보는 시간을 가졌습니다.
놀랐던 점은 구글에 쳐봤을 때, 제일 처음에 나오는 블로그의 코드가 저와 비슷했다는 점에서 신기했던 것 같습니다.
#include <iostream>
#include <queue>
using namespace std;
int N;
queue<int> q;
int main(void){
scanf("%d", &N);
for(int i=1; i<=N; i++){
q.push(i);
}
while(q.size() != 1){
cout << q.front() << " ";
q.pop();
q.push(q.front());
q.pop();
}
cout << q.front();
return 0;
}
이 코드는 블로그의 코드인데 이 분은 따로 vector를 선언하지 않고 바로바로 q.front()를 출력했다는 점이 신기했던 것 같습니다.
저는 문제의 정보대로 container를 선언하는 습관이 있어 저렇게 풀었는데 이분은 단순하게 생각하셨다는 게 대단했던 것 같습니다.
'코테 > 항해99' 카테고리의 다른 글
[99클럽 코테 스터디 20일차 TIL] #힙2 (1) | 2024.11.16 |
---|---|
[99클럽 코테 스터디 19일차 TIL] #힙 1 (4) | 2024.11.15 |
[99클럽 코테 스터디 15일차 TIL] #스택/ 큐 4 (2) | 2024.11.11 |
[99클럽 코테 스터디 14일차 TIL] #스택/ 큐 3 (3) | 2024.11.11 |
[99클럽 코테 스터디 13일차 TIL] #스택/큐 2 (0) | 2024.11.10 |