여행을 개발하다

2차원 배열의 응용 - 'ㄹ'자 배열 만들기 본문

BackEnd/C++

2차원 배열의 응용 - 'ㄹ'자 배열 만들기

yhtragramming 2019. 5. 10. 23:16

안녕하세요!

 

오늘은 2차원 배열의 응용 예제로, 'ㄹ' 자 모양의 배열을 만들어보겠습니다.

 

제가 그 많고 많은 예제 중에 'ㄹ'자 배열을 선택했냐면요...

지난달 말에 치룬 정보처리기사 실기 시험에서 나왔기 때문이에요.

 

시험지에서 직접 봐서 그런지, 한 번쯤 직접 구현해보고 싶더라구요!!

마침 2차원 배열 이야기를 하고 있던 중이어서, 타이밍도 좋았습니다!


1. 'ㄹ'자 배열

'ㄹ'자 배열은 다음과 같은 배열을 말하는데요.

자세히 보시면, 숫자가 증가하는 방향이 'ㄹ'자 형태를 띕니다.

2. C++로 'ㄹ'자 배열 구현하기

그럼 C++로 'ㄹ' 자 배열을 구현해보도록 하되,

한 번은 2차원 배열의 정적 할당으로, 한 번은 동적 할당으로 해보겠습니다.

2-1. 정적 할당으로 구현하기

임의로, 5*5의 정적 할당 배열로 구현해보겠습니다.

 

먼저 배열의 할당과 변수 선언을 진행하겠습니다.

 

① 5 * 5 배열의 선언

② 변수의 선언

변수는 총 5개를 선언할 것이며, 각 변수에 대한 설명은 다음과 같습니다.

* k = 각 배열에 들어갈 자연수, 1씩 증가하여 최종 5 * 5 = 25로 값이 끝난다.

* start = 반복할 인수의 시작.

* end = 반복할 인수의 끝. 5 * 5 사이즈로 선언할 경우, 끝의 열 번호가 4이므로 4로 선언.

* sw = 스위치 변수, 배열이 오른쪽으로 가면 1씩 증가시키고 , 왼쪽으로 가면 1씩 감소시킴.

* temp = start와 end의 값이 뒤바뀔 때 상호 값의 스와핑을 위해 저장할 임의 변수

그 후, 2차원 배열의 끝까지 반복하며 숫자를 채워주는 작업을 하겠습니다.

 

바깥쪽 for문은 5행을 차례대로 입력하는 역할을 담당하며,

안쪽 for문은 5열을 차례대로 입력하는 역할을 담당합니다.

 

i와 j는 행과 열의 인덱스 정보를 알려주는 변수입니다.

 

i는 행의 개수가 총 5개이므로 0부터 4까지 5번을 반복하며,

j는 열이 숫자를 증가시키냐 혹은 감소시키냐에 따라 start와 end의 값이 달라질 수 있도록 합니다.

 

증가치는 스위치 변수인 sw를 단계별로 더한 값으로 설정합니다.

즉, 1씩 더하냐 빼냐가 증가치가 됩니다.

 

j는 start부터 시작하는데, end값과 증가치를 더한 값이 같지 않을 때까지 반복합니다.

결국, 첫 번째 반복은 5가 아닌 4까지만 반복하겠죠?

어렵사리 한 번 반복이 끝났는데, 이제는 방향을 바꿔야 할 타임입니다.

여기까지는 잘 끝냈는데, 이게 문제가 되네요.

생각해보니, 5까지 입력했던 열의 인덱스 j는 그대로 유지하되, 증가치만 -1로 바꿔주면 되겠네요!!

이와 동시, 시작 인덱스는 4, 끝 인덱스는 0으로 설정해주면 됩니다.

 

행 인덱스를 관장하는 i는 전혀 건들 필요가 없구요.

 

그래서 start와 end만 서로 위치를 바꿔주고, sw는 기존 sw값에 -1을 곱해줄께요.

그리고 여기서 temp라는 변수를 처음 씁니다. 스와핑을 위한 임의 변수라고 설명드렸죠?

여기까지 완료되면 2번째 반복의 디버깅을 해보도록 하겠습니다.

 

기존 인덱스 변수 j에는 4가 들어갔고, 증가치는 -1이 됩니다.

또한, 반복은 j가 -1(end(0) + sw(-1) != -1)이 아닐 때까지 수행합니다. 0이 되면 멈추겠죠?

자 이제 모든 반복을 마쳤다면 배열의 값을 출력해보도록 하겠습니다.

변수가 많아졌으니 전역 변수와 지역 변수들 간 중복이 안되게 신경 써주세요!

이제 출력해보도록 하겠습니다.

짜잔 잘 나오네요~ㅎㅎ

 

2-2. 동적 할당으로 구현하기

동적 할당이라고 많이 어려울까요. 위에서 작업을 다해놔서, 사실 할 일이 없네요 ㅎㅎ

사용자로부터 변수를 하나 추가로 입력받고, 선언했던 변수들만 조금씩 고쳐줄께요.

 

에이, 이왕 물어본 것... 배열까지 선언하겠습니다.

변수들을 조금씩 수술만 해줄까요?

 

먼저 end는 배열의 길이보다 항상 1만큼 작아야만 하므로, end값엔 'n-1'을 넣어줍니다.

 

행 인덱스 변수 i도 역시 0부터 n-1까지 할꺼구요.

 

출력도 모두 n-1까지 해주겠습니다.

 

이제 프로그램 실행~~

좀 빡세게(컴퓨터만, 저는 아님 ㅎㅎ) 13 * 13 배열을 출력해볼까요?

 

네 아무런 문제 없이 잘 출력되네요! : )

 

 


지금까지 2차원 배열을 활용한 'ㄹ'자 배열 알고리즘에 대해 알아보았습니다.

 

다음 시간에 뵐께요!!

 

모두 즐거운 주말 보내세요 : )

Comments