몇 행 몇 열은 랜덤으로 입력 하는데
지금 테스트 할땐 입력할때 3행 3열 까지만 만드려고 합니다
행이나 열이 늘어나도 어차피 방식만 같으면 되기 때문에
일단 간단하게 3행 3열로 만들어서 테스트 중인데요
처음에 3행 3열의 2차원 배열에 값을 하나하나 다 집어넣어 놓은 상태에서
각 행 별로 서로 영향이 안되게 해서
0행은 0행만 움직이게 하고
1행은 1행만 움직이게 하는거 까진 했습니다
여기서 제가 하려고 하는데
위치를 서로 변경 하려 하는데
예를들어 0행 0열에서
열이 총 3개 즉 인덱스가 0 1 2 이렇게 3개 있는데
0번째가 2번째로 가고
2번째는 1번째로
1번째는 0번째로 가게 하려고 하는데
임시변수를 활용해서
0번째에 있는 값이 2번째로 가는건 수월 하게 잘 됩니다
하지만 1번째값이 0번째로 가고 2번째 값이 1번째로 가는 과정에서
1번째 값은 0번째로 그대로 가지만
2번째 값이 1번째로 갈때 그 값이 그대로 이동 하는게 아니라
1번째 값이 0번째로 가면서 2번째 값이 1번째 값으로 복사가 되서
1번째로 이동을 하네요
저는 열의 값을 + 1 해서 배열을 밀기만 했는데 값이 사라지면서 복사가 되서 입력이 됩니다
// 행, 열의 개수를 선택 행 = choice2 , 열 = choice3;
printf("몇 층 입니까 : ");
scanf("%d", &choice2);
printf("몇 명 입니까 : ");
scanf("%d", &choice3);
for (int i = 0; i <= choice2 - 1; i++)
{
for (int j = 0; j <= choice3 - 1; j++)
{
name[i][j] = 0;
}
}
for (int i = 0; i <= choice2 - 1; i++)
{
for (int j = 0; j <= choice3 - 1; j++)
{
age[i][j] = 0;
}
}
printf("입주민의 정보를 입력하세요\n");
for (int i = 0; i <= choice2 - 1; i++)
{
for (int j = 0; j <= choice3 - 1; j++)
{
printf("10%d동 10%d호\n", i + 1, j + 1);
printf("이름 입력 : ");
getchar();
scanf("%c", &name1);
name[i][j] = name1;
printf("나이 입력 : ");
scanf("%d", &age1);
age[i][j] = age1;
}
printf("\n");
}
while (1)
{
for (int i = 0; i <= choice2 - 1; i++)
{
printf("-----------------------------------------------------------------------------------------------\n");
for (int j = 0; j <= choice3 - 1; j++)
{
printf("ㅣ이름 : %c 나이 : %d", name[i][j], age[i][j]);
}
printf("\n");
}
printf("-----------------------------------------------------------------------------------------------\n");
printf("1. 이사, 2. 입주\n");
scanf("%d", &choice);
if (choice == 1)
{
printf("이사 할 입주민의 정보를 입력하세요\n\n");
printf("이름 : ");
getchar();
scanf("%c", &selectname);
printf("나이 : ");
scanf("%d", &selectage);
printf("\n\n1. 오른쪽으로 밀기, 2. 왼쪽으로 밀기, 3. 한명만 이사가기, 4. 이사 간 뒤 앞으로 입주하기\n");
scanf("%d", &menu);
for (int i = 0; i <= choice2 - 1; i++)
{
for (int j = 0; j <= choice3 - 1; j++)
{
if (name[i][j] == selectname && age[i][j] == selectage)
{
select = i;
select1 = j;
/*name[select][select1] = 0;
age[select][select1] = 0;*/
break;
}
}
}
//index 범위 벗어나지 않게 주의하기
// 이사 후 index범위 벗어남
// 첫번째 사람은 마지막으로 두번째는 첫번째로 세번째는 두번째로
// 그리고 반대로 해보기
// 임시 변수를 만들어서 한칸씩 이동 후 붙여넣기
// 오른쪽으로 땡기냐 왼쪽으로 땡기냐의 차이
// 반대로 할때는 반복문을 choice3에서 -- 해서 하기
// 이사가는 사람이 맨 앞으로 가고 나머지는 뒤로 밀리는 코드
if (menu == 1)
{
//이사 가려는 사람이 맨 뒤로 가고 나머지는 한칸 씩 앞으로 땡겨오는 코드
for (int i = select; i <= select; i++)
{
for (int j = 0; j <= choice3 - 1; j++)
{
if (name[select][select1] == selectname && age[select][select1] == selectage)
{
swapname = name[select][select1];
swapage = age[select][select1];
name[i][j] = name[i][j + 1];
age[i][j] = age[i][j + 1];
name[select][select1 + choice3 - 1] = swapname;
age[select][select1 + choice3 - 1] = swapage;
}
//swapname = name[i][j];
//swapage = age[i][j];
//name[i][j] = name[i][j + 1];
//age[i][j] = age[i][j + 1];
//// 2번째는 1번째 3번째는 2번째로 이동함
//name[i][j + 1] = swapname;
//age[i][j + 1] = swapage;
if (name[i][j] <= choice3 - 1 && age[i][j] <= choice3 - 1)
{
break;
}
}
}
}
코드 구성은 이렇게 되어 있구요
이론적으로 생각을 해봤을때는
if문으로 제가 입력한 값이 해당 배열 안에 있으면
swapname 과 swapage 임시 변수로
0번째 값을 미리 저장 시켜 놓고
j + 1로 배열을 한칸 씩 이동 시키고
임시변수에 있는 값을 choice3 - 1 까지 이동 해서
마지막 열에 있는 값으로 이동을 시키게 만들었는데
이게 원활하게 잘 안되더군요 ㅠㅠ
뭔가 반복되는 범위나 위치가 잘못 됐다거나 하는거같은데
제가 원하는데로
0번째 값이 제일 마지막으로 가고
순차적으로 왼쪽으로 하나씩 이동 하게 하려면
코드를 어떻게 짜야될지
제가 짠 코드가 왜 값이 정확하게 안들어 가는건지
알려주시면 감사하겠습니다
웃지말고 알려줘 ㅠㅠ