이번 포스트에서는 배열 실습문제 유형중에 N개의 정수 배열에서 M개의 칸씩 오른쪽 또는 왼쪽으로 위치를 옮겨서
재 정렬한 배열을 출력하는 유형들입니다.
먼저 다뤄볼 것은 다음 문제입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#pragma warning(disable:4996)
#include <stdio.h>
int main() {
int A[20];
int F, R, M;
for (int i = 0; i < 20; i++) {
A[i] = i + 1;
}
scanf("%d %d %d", &F, &R, &M);
for (int i = R; i > R - M + 1; i--) {
int temp = A[i];
A[i] = A[i - 1];
A[i - 1] = temp;
}
for (int i = 0; i < 20; i++) {
printf("%d ", A[i]);
}
return 0;
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#pragma warning(disable:4996)
#include <stdio.h>
int main() {
char ch[5];
for (int i = 0; i < 5; i++) {
scanf("%c", &ch[i]);
}
for(int k=0;k<5;k++){
for (int i = 4; i >0; i--) {
int temp = ch[i];
ch[i] = ch[i - 1];
ch[i - 1] = temp;
}
for (int i = 0; i < 5; i++) {
printf("%c", ch[i]);
}
printf("\n");
}
return 0;
}
|
cs |
위의 두 문제에서 비슷한 알고리즘이 사용되었습니다.
위의 두 알고리즘은 for문을 시행했을때 가장 뒤에있는 값이 앞으로 오는 결과를 만들어줍니다.
예를들어 6 7 8 9 에 시행을 하면 9 6 7 8 로 결과가 됩니다.(마찬가지로 앞에있는 값을 제일 뒤에보내고싶다면
저 알고리즘을 약간만 수정해주면 가능합니다.)
이 과정을 반복했을시에 다음과 같이 결과가 나옵니다.
6 7 8 9
9 6 7 8
8 9 6 7
7 8 9 6
6 7 8 9
그런데 만약 원하는 출력 값이
1 2 3 4 5
4 5 1 2 3
2 3 4 5 1
. . .
등 처럼 2칸씩 이동해서 출력하라고 하면? 어떻게 해야할까요. 가장 먼저 드는 생각은 한칸씩 이동해주는 알고리즘을 반복해서 실행하고 2칸씩 이동해서 출력할떄는, 반복횟수가 2번 ,4번 ,6번 등등 일때만 출력하는 것입니다. 그러기 위해서 2번째 문제 예시 코드에서 다음과같은 문장을 추가해줍니다.
그리고 결과값입니다.
성공적으로 출력되었습니다. 이것을 통해 1칸씩 이동하는 알고리즘을 M번 반복시마다 출력하여 M칸씩 이동하여 출력하는 알고리즘을 만들수있다는 것을 알게 되었습니다.
지금까지를 종합하여 다음과 같은 문제를 해결해보겠습니다
[문제] N개의 문자를 배열에 입력받고, M개의 칸씩 오른쪽으로 이동한 값을 출력합니다.
이 시행은 처음 입력받은 값과 문자열이 출력될때까지 반복됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#pragma warning(disable:4996)
#include <stdio.h>
/*N개의 문자를 입력받고 M칸씩 이동하여 출력하기*/
int main() {
char ch[100];
char ch1[100];
int N,M;
int flag = 1;
scanf("%d %d", &N,&M);
getchar();// \n가 문자열에 들어가는것 방지
for (int i = 0; i < N; i++) {
scanf("%c", &ch[i]);
ch1[i] = ch[i];
}
int k = 0;
while(flag){
for (int i = N-1; i >0; i--) {
int temp = ch[i];
ch[i] = ch[i - 1];
ch[i - 1] = temp;
}
if(k%M==M-1){
for (int p = 0; p < N; p++) {
printf("%c", ch[p]);
}
if (ch[0] == ch1[0]) flag=0;//처음 문자열과 같아지면 종료
printf("\n");
}
k++;
}
return 0;
}
|
cs |
왼쪽으로 이동한 값도 실습해보세요 !
'지난 학기들의 기록 > C 기초' 카테고리의 다른 글
[C실습] 배열 예제- 배열의 원소 중복 검사하기 (0) | 2020.05.31 |
---|---|
[C실습] 배열 예제- 홀수와 짝수로 구분해서 정렬하기 (0) | 2020.05.31 |
[C실습] 배열 유형 분석 1- N개의 정수배열에서 M개씩 그룹지어 비교하기(+추가) (2) | 2020.05.31 |
[C실습] 배열 실습문제 11~13번 풀이 (0) | 2020.05.21 |
[C언어] 범위가 지정된 난수생성 : a~b 범위의 난수를 생성하라 (0) | 2020.05.11 |
댓글