백준 1193번 C언어

Boomerang·2021년 8월 6일
0
post-thumbnail
  1. 숫자가 주어졌을때 행렬만 구하면 된다고 생각했다. 왜냐하면 행+1/열+1이 구하는 값이라서.
  2. 대각선을 기준 줄이라고 생각하고 줄 세워보면, 규칙이 있다고 생각했다. 역방향, 정방향에 따라 숫자가 늘어나나 줄어드나 차이가 있다고 여김
  3. 숫자를 넣었을때 일단 몇번째 줄인지 알아야한다고 생각했다.
  4. 1, 2 3, 4 5 6, 7 8 9 10, 11 12 13 14 15, .. 이런식이니까 숫자 넣었을때 몇번째 줄인지 알 수 있게 count를 늘려 가는 방식을 먼저 만들어야지라고 생각함.
  5. 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에 대해 고민해보고 규칙을 찾았으면 더 빠르게 풀 수 있었을 것이다.

profile
Hello World

0개의 댓글