루프를 사용하여 숫자 패턴 인쇄

나는 최근에 취업 면접 준비 웹사이트 중 한 곳에서 이 질문을 발견했습니다. 문제는 단순히 1에서 n까지의 숫자가 주어진 숫자 패턴을 인쇄하는 것입니다. 예를 들어, n은 5입니다.

5 5 5 5 5 5 5 5 5 
5 4 4 4 4 4 4 4 5 
5 4 3 3 3 3 3 4 5 
5 4 3 2 2 2 3 4 5 
5 4 3 2 1 2 3 4 5 
5 4 3 2 2 2 3 4 5 
5 4 3 3 3 3 3 4 5 
5 4 4 4 4 4 4 4 5 
5 5 5 5 5 5 5 5 5


변수(n, 열, 행)를 기반으로 특정 숫자를 계산하기 위해 수학 함수를 보간하려고 했기 때문에 솔직히 두통이 생겼습니다.

내가 마침내 생각해낸 해결책은 각 행(왼쪽에서 오른쪽으로)을 n*2-1 요소의 배열로 간주하고 전체 패턴을 n*2-1 행(위에서 아래로)의 가상 다중 희미한 배열로 간주합니다. 실제로 multi-dim 배열을 생성하지 않기 때문에 허구입니다. 이는 n*2-1이 각 행(배열)의 길이임을 의미합니다.

첫 번째 행은 n+1로 초기화됩니다. 그런 다음 행 0에서 길이까지 각 반복에서 인덱스 행에서 역 인덱스 길이-행까지의 배열 요소가 조작됩니다(감소 및 증가). 즉, 행 0의 첫 번째 반복에서 인덱스 0에서 9-0 사이의 요소가 감소합니다. 어레이가 n+1로 초기화된 이유입니다. 두 번째 반복에서는 인덱스 1에서 9-1 사이의 요소가 감소합니다. 인덱스 4의 중간점이 다섯 번째 행 이후에 전달될 때까지 계속됩니다. 그런 다음 연산이 역순으로 이루어지고 인덱스 length-row to row 사이의 요소가 증가합니다.

int main() {
  int n = 5;   

  int length = (n*2)-1;
  int numbers[length];

  // initialize array row with n+1
  for (int i = 0; i < length; i++) { 
      numbers[i] = n+1; 
  }

  // iterate through all rows
  for(int row = 0; row < length; row++) {
      // decrement elements until midpoint
      for(int i = row; i < (length-row); i++) { 
          numbers[i] -= 1;  
      }
      // increment elements after midpoint
      for(int i = (length-row); i < row; i++) { 
          numbers[i] += 1;  
      }        
      // print current array row
      for(int i = 0; i < length; i++) { 
          printf("%d ", numbers[i]); 
      }
      // print line break        
      printf("\n");
  }

  return 0;
}


나는 원래 프로그래밍 언어 학습의 일환으로 C로 질문을 해결했습니다. 여기서 대화형 솔루션을 제시하기 위해 TypeScript로 변환했지만 알고리즘은 기본적으로 동일합니다.



이 문제에 대한 다른 솔루션이나 내 솔루션에 대한 개선 사항이 있는지 알고 싶습니다.

좋은 웹페이지 즐겨찾기