- 숫자가 주어졌을때 행렬만 구하면 된다고 생각했다. 왜냐하면 행+1/열+1이 구하는 값이라서.
- 대각선을 기준 줄이라고 생각하고 줄 세워보면, 규칙이 있다고 생각했다. 역방향, 정방향에 따라 숫자가 늘어나나 줄어드나 차이가 있다고 여김
- 숫자를 넣었을때 일단 몇번째 줄인지 알아야한다고 생각했다.
- 1, 2 3, 4 5 6, 7 8 9 10, 11 12 13 14 15, .. 이런식이니까 숫자 넣었을때 몇번째 줄인지 알 수 있게 count를 늘려 가는 방식을 먼저 만들어야지라고 생각함.
- flag는 움직인 횟수
- 주석 처리한 부분을 해제하면 이해가 쉽다
#include <stdio.h>
int main(void){
int n, count = 0, floor = 0, floor_first_var = 0,flag = 0;
int index_i, index_j;
scanf("%d", &n);
for(int i = 0; i< n; i++){
for(int j = 0; j <= i; j++){
++count;
if(count == n){
floor = i+1;
floor_first_var = count-j;
flag = j+1;
goto EXIT;
}
}
//printf("\n");
}
EXIT:
//printf("\nfloor is %d\n", floor);
//printf("floor first var %d\n", floor_first_var);
if(floor % 2 != 0){
// 정방향일때
//printf("floor first var index is %d,%d\n", floor-1,0);
index_i = floor-1;
index_j = 0;
//printf("flag is %d\n", flag);
for(int i = 0; i < flag-1; i++){
index_i--;
index_j++;
}
}
else{
// 역방향일때
//printf("floor first var index is %d,%d\n", 0,floor-1);
index_i = 0;
index_j = floor-1;
//printf("flag is %d\n", flag);
for(int i = 0; i < flag-1; i++){
index_i++;
index_j--;
}
}
//printf("i %d ,j %d\n",index_i,index_j);
//printf("the answer is %d/%d", index_i+1,index_j+1);
printf("%d/%d", index_i+1, index_j+1);
return 0;
}
다른 풀이를 찾아보니까 같은 줄에 있는 합은 동일하기때문에, 합을 기준으로 index를 찾고 계산하는 방식이었다.
조금 더 index에 대해 고민해보고 규칙을 찾았으면 더 빠르게 풀 수 있었을 것이다.