처음에 erase 안 쓰고 true, false 값을 따로 둬서 구하려고 했었다.
그리고 나머지 연산 써서 인덱스로 계산하려고 했는데 너무너무 복잡했다.
그렇게 삽질 하다가 안 되겠다 싶어서 그냥 그대로 구현했다.
나머지 연산도 안 하고 그냥 1씩 계속 더했다.. 진작 이렇게 풀껄
T가 100이고 N이 100이어서 시간 내로 충분히 돌아간다.
erase 쓰더라도 잘 돌아간다ㅋㅋ (참고 : erase()의 시간 복잡도는 N이다)
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
bool check(vector<int> &v) {
for (int i = 0; i < v.size() - 1; i++) {
if (v[i] != v[i+1])
return false;
}
return true;
}
void printv(vector<int> &v) {
for (int i = 0; i < v.size(); i++) {
printf("%d ", v[i]);
}
printf("\n");
}
void solve(int n, int m) {
vector<int> v(n);
int start = 0;
while(true) {
for (int i = 0; i < m; i++) {
v[(i + start) % v.size()]++;
}
int r = m % v.size();
if (r == 0)
r = v.size();
v.erase(v.begin() + (start + r - 1) % v.size());
start = (start + r - 1) % (v.size() + 1);
if (start == v.size())
start = 0;
if(check(v))
break;
}
printf("%d %d\n", v.size(), v[0]);
}
int main() {
int n, m;
while (1) {
scanf("%d", &n);
if (n == 0)
break;
scanf("%d", &m);
solve(n, m);
}
return 0;
}
처음에 한 번 틀렸었다. 원인은 v.erase()를 하고 난 다음 start를 계산할 때 v.size() 값이 달라져서 문제였다.
그래서 v.size()값을 기준으로 계산한 뒤 만약 start값이 배열의 범위를 넘어서면 0으로 돌아가게 구현했다.
erase 사용할 때 조심해야겠다.
'백준' 카테고리의 다른 글
16426 '나교수' 교수님의 악필 (0) | 2021.04.24 |
---|---|
19698 헛간 청약 (0) | 2021.04.24 |
1697 숨바꼭질 (0) | 2021.04.16 |
10451 순열 사이클 (2) | 2021.04.16 |
6373 Round and Round We Go (0) | 2021.03.20 |