목록수학 (60)
정화 코딩

https://www.acmicpc.net/problem/28300 우선 이 문제의 포인트는 행이동/열이동과 스왑 연산을 분리하여 각각 처리해주는 것이다. 스왑 연산은 어떤 수와 어떤 수를 스왑하는지만 잘 저장해둔다면 어느 순서에서 하든 상관없기 때문에, 일단 무시하고 마지막에 한번에 처리해주도록 하자. 그렇다면 지금은 행이동/열이동만 순서대로 보면서 처리해주겠다. 이것들은 순서가 중요하기 때문에 한번에 모아서 처리하거나 하기 어렵다. 그렇다고 n*n 배열에서 실제로 행이동과 열이동을 매번 시켜주면 많은 시간이 걸릴 것이다. 잘 생각해보면 이렇게 행이동/열이동으로는 저 4개의 수끼리의 위치는 절대 바뀔 수 없다. 행이동과 열이동은 무조건 짝수 행/열 또는 홀수 행/열에 대해서만 이루어지기 때문이다. 그렇..

https://www.acmicpc.net/problem/30788 각도가 d인 축을 기준으로 대칭이동 시켰을 때 그림이 얼마나 회전하는지를 계산하기 위한 뻘짓...그래서 식은 nxt = (2 * d - cur) % 360 이다.(cur: 대칭이동 전의 그림의 각도, nxt: 대칭이동 후의 그림의 각도, d: 대칭이동 축의 각도) 이건 식 정리 과정...그래서 정리하면 다음과 같다. 우선 그림이 원래 상태로 돌아오려면 대칭이동은 짝수번 시켜야 한다.축이 홀수개이면 무조건 불가능하므로 생각해주지 않아도 된다. k번의 대칭이동 후의 그림의 각도는 2 * d(k) - 2 * d(k-1) + ... + 2 * d(2) - 2 * d(1) 가 된다. (k는 짝수)즉, 짝수 내에서와 홀수 내에서의 축의 배치 ..

https://www.acmicpc.net/problem/1214 대충 이런식으로 써가면서 답을 어떤식으로 구해야 할지 생각해봤다. 일단 p d에서 q의 배수(tq)를 뺀 값(dif)을 p로 나누어서 나머지(rem)를 구했다. 이 때 나머지가 음수거나 0이면 p를 더해서 0보다 큰 값으로 바꾸어준다. 이 값이 가장 큰 경우에 지불할 수 있는 금액의 최소가 된다. 그래서 아까 구한 나머지(rem)가 가장 클 때 답을 구하면 되는데, d에서 뺐던 그 q의 배수(tq)에 몫(quo)을 더해주면 된다. 몫(quo)은 아까 나머지에 p를 더하는 과정을 거쳤으면 그냥 몫으로 계산하면 되고, 그렇지 않았다면 몫+1로 계산하면 된다. 아 그리고 아까 구한 나머지(rem)가 0일 때는 거스름돈 없이 딱 맞게 돈을 지..

https://www.acmicpc.net/problem/2622 #include using namespace std;int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; int ans = 0; // i k) ans++; } } cout 첨에는 합동이 뭔지 살짝 헷갈렸다. 생각해보니 3개의 변의 길이가 모두 같으면 SSS 합동으로, 어떻게 조합해도 하나의 삼각형으로 본다.즉, i // i k) ans++; } }아 처음에는 위 코드처럼 k 시간 단축! 참고: 삼각형의 합동 조건

https://www.acmicpc.net/problem/2331 #include #include using namespace std;int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int a, p; cin >> a >> p; vector ans; ans.push_back(a); int idx = -1; int cur = a; while (1) { int nxt = 0; while (cur > 0) { int rem = cur % 10; int tmp = 1; for (int i = 0; i 단순..

https://www.acmicpc.net/problem/1111 #include #include #include using namespace std;int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector arr(n); for (int i = 0; i > arr[i]; set ans; for (int a = -200; a 2) cout 무지성으로 모든 a, b 조합을 체크해서 풀었다...처음에는 a와 b 범위 모두 -100 ~ 100으로 잡았다가 WA를 받았다. 그 후 범위가 부족함을 깨닫고 범위를 늘려줬다. 무지성으로 너무 늘리면 또 시간초과를 ..

https://www.acmicpc.net/problem/31460 #include #include using namespace std;int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) { int n; cin >> n; if (n == 1) { cout 011121122112221122221...이렇게 규칙만 찾으면 쉽게 풀 수 있는 문제. 0도 11의 배수임에 주의하자. (AC)

https://www.acmicpc.net/problem/13172 이 문제의 핵심을 정리하면 아래와 같다. 기약분수 a/b를 다음과 같이 하나의 정수로 표현할 수 있다. 이 때 X는 1,000,000,007과 같은 큰 소수이다.b^(-1)은 b의 모듈러 곱셈에 대한 역원인데, 다음과 같이 계산할 수 있다. 이 정도만 알면 문제를 풀 수 있다. 이제 구체적으로 어떻게 구현할지 생각해보자.한 줄에 분모와 분자 순서대로 한 쌍의 분수가 들어온다. 각 분수에 대해 a * b^(-1) mod X 를 구하면 된다. 그리고 모든 값들을 마치 확률을 더하듯 그냥 더해주면 된다. 내가 헷갈렸던 점은 기약분수 a/b에 대해서 저렇게 계산해야 된다고 하길래 들어온 분모와 분자에 대해서 우선 기약분수 형태로 만들어줘야..