반응형

도전3. 10인 배열을 선언하고 총 10개의 정수를 입력받는다. 단 입력받은 숫자가 홀수이면 배열의 앞에서부터 채워나가고, 짝수이면 뒤에서부터 채워나가는 형식을 취하기로 하자. 따라서 사용자가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]을 입력했다면, 배열에는[1, 3, 5, 7, 9, 10, 8, 6, 4, 2]의 순으로 저장이 될 것이다.

 

 

우리가 배열에 접근하기위해 흔히 인덱스를 사용합니다. 

인덱스라는 개념이 잘 와닿지 않으신 분들을 위해서 예를 들어보겠습니다. 

길이가10인 배열이 있을때, 배열을 출력하는 코드는 

for(i=0 ; i<10 ; i++)
    printf("%d", arr[i]);

이런 식인데, 여기서 i 가 바로 인덱스 입니다. 

뭐랄까.. 배열으로의 접근을 도와주는 그런 변수입니다. 

 

문제에서는 홀수는 앞에서 채우고 짝수는 뒤에서 채우라고 말합니다. 

가장 쉬운 해결법은 인덱스를 2개를 사용하는것입니다. 

인덱스 1개는 보통 배열 다루듯이, 0에서부터(앞에서부터) 인덱스를 증가하며 차례로 배열에 접근하여, 홀수를 넣고

나머지 하나는 9에서부터(뒤에서부터) 인덱스를 감소하며 차례로 배열에 접근해 짝수를 넣게 만들면 됩니다. 

 

문제에서는 배열의 길이가 10이라고 정해져 있어서 코드가 간단하지만, 

나중에 메모리를 동적할당 받아, 프로그램에서 다룰 배열의 길이가 주어지지 않는다면, 

배열에 넣을 때, 끝나는 제한장치를 하나 만들어 놔야 합니다. 

 

즉 앞에서도 배열을 채우고 뒤에서도 배열을 채우면, 

앞 인덱스가 뒤 인덱스보다 커지는 순간

채우기를 멈춰야 합니다. (그렇지 않으면, 데이터가 덮어씌워 질 것입니다) 

저도 약간 고민을 한 부분인데 앞 인덱스와 뒤 인덱스가 같은건 상관이 없습니다. 

숫자1개 입력받고 검사하고 하는 과정이기 때문에, 

숫자 1개는 홀수이거나 짝수입니다. 

앞 인덱스와 뒤 인덱스가 한 단계에서 둘다 움직이는 경우는 없기 때문에 

앞 인덱스와 뒤 인덱스가 같은 경우엔 앞인덱스를 이용해서 채우든 뒤 인덱스를 이용해서 

채우든 결과는 같고 프로그램상도 문제가 없기 때문입니다. 

(물론 이때 수가 홀수라면 앞 인덱스로, 짝수라면 뒤 인덱스를 이용하여 배열을 채웁니다) 

 

 

의사코드입니다. 

 

길이가 10인 배열을 선언, 

앞쪽에서 넣는 인덱스 front 0으로, 뒤쪽에서 넣는 인덱스 end 9로 초기화

 

for(i는 0부터 10까지 1씩증가) 

{ 

  수를 입력받는다 

  수가 홀수라면 

  { 

  배열[front]에 수를 넣고, 

  front 인덱스 1 증가 

  } 

  아니라면 (짝수라면)

  { 

  배열[end]에 수를 넣고, 

  end 인덱스 1 감소 

  } 

 

  프론트 인덱스가 엔드인덱스보다 커지면

  반복문 탈출 

} 

 

실제 코드입니다. 

 

주석을 자세히 달아놔서 여기서 특별히 설명할 부분은 없습니다만.

29~31번째줄 코드는 ... 현재 프로그램에서는 주석처리해도(없에도) 잘 작동합니다.

그이유는 13번째 줄 때문이죠.

처음부터 배열의 길이를 10이라고 한정지어 놓고 13번째줄에서 반복문을 10번만 돌게

했기 때문에, 앞 인덱스와 뒤 인덱스의 위치가 바뀌어서 데이터가 덧씌워지는 그런 불상사는

애초에 일어나지 않습니다.

 

그런데, 배열의 길이를 미리 정하지 않고 하는 경우에는

29~31번째줄의 코드가 꼭 필요합니다.

실제로 13번째줄을 for(;;) (무한루프)로 바꿔도

프로그램은 잘 작동합니다. 29~31번째줄 때문입니다.

 

실행결과입니다,

 

이상입니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기