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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 신고 결과 받기 C언어 (5) | 2022.03.14 |
---|---|
프로그래머스 Level 2 : 피보나치 수 C언어 (0) | 2022.02.20 |
프로그래머스 Level 2 : 스킬트리 C언어 (0) | 2022.02.12 |
프로그래머스 Level 2 : 모음 사전 C언어 (0) | 2022.02.12 |
프로그래머스 Level 2 : 주식가격 C언어 (0) | 2022.02.04 |
댓글