본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : n^2 배열 자르기 C언어

by starfish22 2022. 2. 19.
728x90

▶문제 : 코딩 테스트 연습 - n^2 배열 자르기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - n^2 배열 자르기

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부

programmers.co.kr

 

▶코드 작성(개선 코드 있음)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int *solution(int n, long long left, long long right)
{
    int *answer = (int *)malloc(sizeof(int) * (right - left + 2 * n));
    int cnt = 1, tmp;
    long long i, leng = 0;

    for (i = 0; i + n < left; i += n, cnt++);//몇 째줄부터 left가 시작인지 확인
    tmp = left - i;//시작하는 i번째에서 left와의 차
    
    for (; i < right; i += n, cnt++)//right까지
    {
        for (int j = 0; j < cnt; j++)//반복되는 수만큼
        {
            answer[leng++] = cnt;
        }
        for (int j = cnt; j < n; j++)//나머지 자리수만큼
        {
            answer[leng++] = j + 1;
        }
    }

    answer = answer + tmp;//i번째에서 left와의 차 만큼 포인터에 더해주기

    return answer;
}

 

▶개선 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int *solution(int n, long long left, long long right)
{
    int *answer = (int *)malloc(sizeof(int) * (right - left + 1));

    for (long long i = left; i <= right; i++)
    {
        if (i % n > i / n) {
            answer[i - left] = i % n + 1;//뒤에 이어지는 증가하는 수
        }//i - left 로 0부터 시작
        else {
            answer[i - left] = i / n + 1;//앞쪽의 반복되는 수
        }
    }

    return answer;
}

 

▶해석

left부터 right까지의 딱 맞는 크기의 answer동적 배열을 할당하고, 반복문으로 left부터 right까지 반복하면서 i%n과 i/n을 비교하여 answer배열에 저장하였다.

i%n는 뒤에 이어지는 증가하는 수로 예를 들어 1 2 3  2 2 3  3 3 3 노란색을 가리키고

i/n는 앞에서 반복하는 수로 1 2 3  2 2 3  3 3 3 빨간색을 가리킨다.

728x90

댓글