[질문]2차원배열 정렬 조언부탁드립니다.^^;

mnnclub의 이미지

문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/

아래는.. 버블정렬 이용해서 만들어본것입니다..

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void sort(int num[0][0])
{
int i,x,y,temp;
for(x=0;x<10;x++)
{
for(i=0;i<20;i++)
{
for(y=0;y<20;y++)
{

if(num[x][i]>num[x][y])
{
temp=num[x][i];
num[x][i]=num[x][y];
num[x][y]=temp;
}

}

}
}

}


int main()
{

int x,y,num[10][20];
srand(time(NULL));


for(x=0;x<10;x++)
{
for(y=0; y<20; y++)
{
num[x][y]=rand()%90 + 10;
}
}

for(x=0; x<10; x++) sort(&num[x][0]);

for(x=0;x<10;x++)
{
printf("\n");
for(y=0; y<20; y++)
printf("%d ",num[x][y]);
}

return 0;

}

컴팔하고 실행하면,
# gcc -o bubble bubble.c
# ./bubble

99 96 92 92 92 81 70 67 62 57 56 55 52 47 34 33 31 30 23 16
94 90 89 82 73 73 70 65 63 60 58 58 43 39 37 36 34 33 26 19
86 72 72 65 64 60 56 52 51 47 40 31 30 27 26 24 17 13 12 10
98 98 98 89 85 79 77 74 72 72 64 64 50 45 43 35 35 23 20 10
97 95 89 87 87 86 86 85 81 76 76 60 50 47 32 30 27 24 10 10
91 89 88 88 79 74 74 62 58 55 55 54 35 35 30 29 27 25 13 12
95 94 84 81 79 74 66 65 63 55 50 48 45 34 34 34 26 13 11 11
98 93 90 85 84 79 77 71 70 70 59 58 25 24 22 22 22 21 21 20
89 80 80 75 74 72 69 68 67 67 64 58 54 53 41 39 31 22 19 11
96 94 90 90 81 74 73 68 56 50 48 45 45 44 44 31 25 19 17 13
---

이론 --;. 한줄씩만, 정렬이되네요.

너무 무식하게 짠거같은데,, 조언좀 해주세요^^;

들여쓰기에서 글썼는데 게시판에는 안올라와서

소스보기가좀 안좋네요.죄송^^;

mnnclub의 이미지

위에 소스 보기안좋아서 아래주소에서 봐주세욥^^;;

http://albatross.yongin.ac.kr/~mnnclup/bubble.c

doldori의 이미지

정렬할 필요가 있나요? 그냥 num[0][0]부터 num[9][19]까지 훑어가면서
최대값과 최소값의 첨자만 기억하면 될 텐데요.

ps. 그런데 이 코드가 컴파일이 되나요? -.-a

jindog의 이미지

mnnclup wrote:
문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/

void sort(int num[0][0])
{
int i,x,y,temp;
for(x=0;x<10;x++)

---

정말로 배열의 시작주소를 전달하셨네요 ^^;;;
저는 보통 int * a[] 이나 int ** a 이런식으로 쓰는데 ... 제가 특이한건지^^;;

다른 분 글처럼 최대 최소는 그냥 인자만 기억하심이;
2차원으로 안읽고 한줄로 있는 녀석들을 ;;; 읽어가신다고 생각

cronex의 이미지

mnnclup wrote:
문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/


주어진 문제에 맞는 답을 내시려면 지금의 방법으론 안될 듯 합니다.
왜냐하면 문제에서 원하는건 원래 저장되어있는 위치를 가져와야 하는데 정렬을 해버리면 그 위치가 변경되죠.
즉 그 값 자체는 가져올 수 있을지 몰라도 원래의 위치를 복원할 수는 없습니다.

가장 간단한 방법이라면 어느 분이 지적하신대로 전체를 다 순환하면서
최대값과 최소값의 위치를 기억하는 방법이겠구요.

다른 방법이라면 각각 한 줄에 대해서 최대값과 최소값을 구하고
다시 이것들에 대해서 최대값과 최소값을 구하면 되겠습니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

mnnclub의 이미지

doldori wrote:
정렬할 필요가 있나요? 그냥 num[0][0]부터 num[9][19]까지 훑어가면서
최대값과 최소값의 첨자만 기억하면 될 텐데요.

ps. 그런데 이 코드가 컴파일이 되나요? -.-a

리눅스에선 되는데 비쥬얼베이직c++에선 안되네요^^;;
생각해보니 2번째문제가 있어서요..
--
2. 위에서 작성한 2차원 배열의 원소들을 정렬하는 C 함수를 작성하시오.
(힌트: 배열의 원소를 교환하는 프로그램.. 어쩌구저쩌구..~)

답변감사합니다..^^

mnnclub의 이미지

cronex wrote:
mnnclup wrote:
문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/


주어진 문제에 맞는 답을 내시려면 지금의 방법으론 안될 듯 합니다.
왜냐하면 문제에서 원하는건 원래 저장되어있는 위치를 가져와야 하는데 정렬을 해버리면 그 위치가 변경되죠.
즉 그 값 자체는 가져올 수 있을지 몰라도 원래의 위치를 복원할 수는 없습니다.

가장 간단한 방법이라면 어느 분이 지적하신대로 전체를 다 순환하면서
최대값과 최소값의 위치를 기억하는 방법이겠구요.

다른 방법이라면 각각 한 줄에 대해서 최대값과 최소값을 구하고
다시 이것들에 대해서 최대값과 최소값을 구하면 되겠습니다.

아.원래위치는 아니구요.
정렬한다음에 해당위치 [3][5] 가 최대값이 들어있고,
[6][7]에 최소값이 들어있다~ 이런식으로 하면될꺼같네요.
근데,정렬하면 당연히 [0][0]에 최대값이 들어갈것이고,
[19][19]에 최소값이 들어가겠죠.

문제는 최대최소값구하는것보다는 정렬인데,..음..
아까 질문에서, 정렬하는내용을 제가 빠뜨렸거든요..

음..어찌했든. 그래서 간단하게 2차원배열 2*2 즉 4개를
정렬해보려고 합니다.
아래와같이..

#include <stdio.h>

int main()
{
int num[2][2]={33,22,77,55};
int x,y;
int *p;

for(x=0; x<2; x++) {
for(y=0; y<2; y++) printf("%d \n",num[x][y]);
}

p = &num; // <-여기서에러가나네요.

for(x=0; x<2; x++) {
for(y=0; y<2; y++) printf("%d \n",p);
}

return 0;
}

포인터로 주소값받아서 하려고
p = &num 했는데 여기서에러나네요
p= &num[] 이런것도 안되공..-..

음어쨋든고민해봐야겠어요..휴..
답변감사드립니다^^;

mnnclub의 이미지

위에 심플소스 아래처럼수정하니 에러는없는데,,
p값이 배열에 있는그값이 아닌 주소값을 출력하는듯..하네요..음..

#include <stdio.h>

int main()
{
int num[2][2]={33,22,77,55};
int x,y;
int *p;

for(x=0; x<2; x++) {
for(y=0; y<2; y++) printf("%d \n",num[x][y]);
}

p = &num[0][0];

for(x=0; x<4; x++) {
printf("%d \n",p+x);
}

return 0;
}

----실행결과--
33
22
77
55
0012FF70
0012FF74
0012FF78
0012FF7C
Press any key to continue

mnnclub의 이미지

옷! 이제 좀 무언가 보이는거같습니다..
오예..~

#include <stdio.h>

int main()
{
int num[2][2]={33,22,77,55};
int x,y;
int *p;

for(x=0; x<2; x++) {
for(y=0; y<2; y++) printf("%d \n",num[x][y]);
}

p = &num[0][0];

for(x=0; x<4; x++) {
printf("%d \n", *(p+x));
}

return 0;
}

--실행결과 --
33
22
77
55
33
22
77
55
Press any key to continue

cronex의 이미지

mnnclup wrote:
문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/

원래 문제에는 정렬을 해야 한다는 내용은 전혀 들어있지 않아서 말씀 드린겁니다.

mnnclup wrote:

아.원래위치는 아니구요.
정렬한다음에 해당위치 [3][5] 가 최대값이 들어있고,
[6][7]에 최소값이 들어있다~
이런식으로 하면될꺼같네요.
근데,정렬하면 당연히 [0][0]에 최대값이 들어갈것이고,
[19][19]에 최소값이 들어가겠죠.

말씀 하신대로 정렬하게 되면 최소값과 최대값이 원래 위치에서 벗어나서 [0][0]와 [9][9]에 들어가게 되죠. 그렇게 되서는 행과 열을 출력하는 의미가 없지 않을 까요? 무조건 [0][0]과 [9][9]를 출력하면 되니까요.

그리고 원하시는 대로 정렬을 [0][0]과 [9][9]에 최대 최소값을 넣는 걸 아주 간단하게 하는 방법이라면 각 행에 대해서 정렬을 하고 또 다시 열에 대해서 정렬을 하는 방법이 있습니다. 물론 최대 최소를 제외하고는 정렬이 되어있지는 않겠습니다만 [0][0]과 [9][9]에는 최대 최소 값이 반드시 들어가 있게 될 겁니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

mnnclub의 이미지

cronex wrote:
mnnclup wrote:
문제인즉,

/*
1. 정수형으로 선언된 2차원 배열에서 최소값과 최대값이 저장된 행과 열의 값을 출력하는 C 함수를 작성하시오.
main() 함수에서 배열은 정수형 10행 20열로 선언해야 하고,
배열의 시작주소가 함수의 인자로 전달되어야 한다.
*/

원래 문제에는 정렬을 해야 한다는 내용은 전혀 들어있지 않아서 말씀 드린겁니다.

mnnclup wrote:

아.원래위치는 아니구요.
정렬한다음에 해당위치 [3][5] 가 최대값이 들어있고,
[6][7]에 최소값이 들어있다~
이런식으로 하면될꺼같네요.
근데,정렬하면 당연히 [0][0]에 최대값이 들어갈것이고,
[19][19]에 최소값이 들어가겠죠.

말씀 하신대로 정렬하게 되면 최소값과 최대값이 원래 위치에서 벗어나서 [0][0]와 [9][9]에 들어가게 되죠. 그렇게 되서는 행과 열을 출력하는 의미가 없지 않을 까요? 무조건 [0][0]과 [9][9]를 출력하면 되니까요.

그리고 원하시는 대로 정렬을 [0][0]과 [9][9]에 최대 최소값을 넣는 걸 아주 간단하게 하는 방법이라면 각 행에 대해서 정렬을 하고 또 다시 열에 대해서 정렬을 하는 방법이 있습니다. 물론 최대 최소를 제외하고는 정렬이 되어있지는 않겠습니다만 [0][0]과 [9][9]에는 최대 최소 값이 반드시 들어가 있게 될 겁니다.

답변감사합니다.
교수님이 참 ..휴.. 정렬하라고 해놓고는 최대 최소값에 배열은
왜 나오게 하라는건지 ..좀 엉뚱한 문제를 내신것같아요..
어쨋든 일주일간고민하던거 드뎌 해결하였습니다. 감사해요^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.