728x90
728x90
풀이
구현 + 수학적 머리 유형인 거 같은데 수학적 머리가 없어서 조금 하드하게 코딩했다.
(find_point함수)
일단 &(1)=(1,1), &(5) = (2,2) 값을 구하기 위해서
먼저 어느 대각선에 속하는지 찾았다.
그 후에 (1,y) 부터 y를 -1, x을 +1 계산하며 해당 숫자의 행과 열을 찾았다.
이렇게 두 번을 반복해서 입력받은 값을 pair로 반환한 후에 first끼리, second끼리 더해준 후
(find_num함수)
다시 이 과정을 되돌리기 위해서 해당 좌표를 받은 후에 숫자로 다시 반환하는 함수를 구현했다.
만약 (3,3)이면 x축으로 3번가는데 이때 +2, +3, ... 이렇게 1씩 증가시켜가며 더해준다. 이 후 y축으로는 x축만큼 간 것을 초기값으로 한 층 올라갈 때마다 +1씩 해주면서 올라간다.
#include <iostream>
#include <vector>
using namespace std;
int find_num(int x, int y) {
int ans = 0;
for (int i = 1; i <= x; i++) { // x축 이동
ans += i;
}
for (int i = 1; i < y; i++) { // y축 이동
ans += x;
x++;
}
return ans;
}
pair<int,int> find_point(int point ) {
int x = 1, y = 1, flag=1,ans=1;
while (true) {
if (point <= ans) { // 몇 번째 행 대각선에 있는지 확인
while (true) {
if (point == ans) {
return make_pair(y,x);
}
else {
y--;
x++;
ans--;
}
}
}
else {
flag++;
ans += flag; // 숫자
y++;
}
}
}
int main() {
int t_c; cin >> t_c; // test_case;
for (int i = 0; i < t_c; i++) {
int a, b;
cin >> a >> b;
pair <int, int> p1 = find_point(a);
pair <int, int> p2 = find_point(b);
int x_p = p1.first + p2.first;
int y_p = p1.second + p2.second;
cout << "#" << i + 1 << " " << find_num(x_p, y_p) << endl;
}
return 0;
}
728x90
728x90
'Algorihtm > SWEA' 카테고리의 다른 글
C++ SWEA 1213. [S/W 문제해결 기본] 3일차 - String (0) | 2023.11.18 |
---|---|
C++ SWEA 2814. 최장 경로 (0) | 2023.11.17 |
C++ SWEA 2817. 부분 수열의 합 (0) | 2023.11.12 |
C++ SWEA 1289. 원재의 메모리 복구하기 (0) | 2023.11.09 |
C++ SWEA 1860. 진기의 최고급 붕어빵 (0) | 2023.11.08 |