가치있는 고민일까요?

rainmon의 이미지


문제.
10x10의 사각형을 그려라.

출력화면.

XXXXXXXXXXX
X.........X
X.........X
X.........X
X.........X
X.........X
X.........X
X.........X
X.........X
XXXXXXXXXXX

다음과 같이 코딩 할 수는 있습니다.

#include <iostream>
 
using namespace std;
 
const int X_SIZE = 10;
const int Y_SIZE = 10;
 
int main()
{
  for(int y = 0; y < Y_SIZE; y++) {
    cout << 'X';
 
    for(int x = 0; x < X_SIZE; x++) {
      if(x == 9 || y == 0 || y == 9)
	cout << 'X';
      else
	cout << '.';
    }
    cout << '\n';
  }
 
  return 0;
}

제가 작성한 코드지만 마음에 들지않고 실망스럽니다.
그 이유로는 이 코드에는 알고리즘이 없어보입니다.

그래서 2차원 배열과 비트연산을 사용해서 만들어보려고 하는데..
이런걸 고민하는것도 가치가 있을까요?

소타의 이미지

이걸 해결하셨으면 다음 문제로 넘어가 보는건 어떨까요?
만든 프로그램을 자꾸 뒤집는 버릇 들여놓으면 나중에 힘들더군요;;
분명히 더 좋은 방법이 있겠지만 지금 잘 동작하는 것도 의미가 있다는 것을;;;;;

rainmon의 이미지

저도 소타님 말씀대로 이건 어째든 문제를 해결했으니 다음 진도를 나가고 싶은데..
비트연산을 활용할 만한 규칙성 같은게 보일듯 말듯 해서 어쩔까나 하고 있습니다.
이런 결과에도 나름 의미가 있다니 위로가 됩니다. ^^

breadncup의 이미지

왜 알고리즘이 필요한가, 왜 Performance가 필요한가?
그리고 알고리즘과 Performance는 왜 중요한가?

의 고민이 Computer Science에는 매우 중요한 요소중의 하나이죠.

그 유명한 MIT 대학교수인 Charles E. Leiserson의 Introduction to Algorithm의 첫번째 강의를 소개합니다. (MIT의 Algorithm Open 강의입니다.)

Direct URL: http://video.google.com/videoplay?docid=-2333306016564732003

한번 시간 되실때, 들어보시면 무척 도움이 될 듯 싶습니다.

~~~~~~~~~ Signature

  1. http://kblog.breadncup.com/about/
  2. http://kblog.breadncup.com/
breadncup의 이미지

#include <stdio.h>
 
#define F_AND_L "XXXXXXXXXX"
#define MIDDLE "X........X"
 
int main(void) {
	int i;
	for (i=0; i < 10 ; i++) {
		if(i%9) {
			printf("%s\n", MIDDLE);
		} else {
			printf("%s\n", F_AND_L);
		}
	}
}

(O(n))으로 만들어서 위와 같이 할수도 있겠습니다만...

만일 문제가 NxN 이었거나, O(n)만으로 해야 한다던가, 아니면, 다른 알고리즘을 요구한다던가 하면, 좀 더 재미있고, 좀 더 나은 결과가 있을지도 모릅니다만.....

근데, 배열과 비트연산으로 한 결과물도 궁금해지네요.

~~~~~~~~~ Signature

  1. http://kblog.breadncup.com/about/
  2. http://kblog.breadncup.com/
redneval의 이미지

코드의 재사용성 (모듈화) 을 생각해보는 것은 어떨까요?

저라면,

배열생성
X 로 사각형 그리기
. 으로 사각형 안을 채우기
배열출력하기

으로 분리하여 각각 함수로 만들어보겠습니다.

타원, 직선, 곡선 등등을 그려주는 함수들의 라이브러리로 발전시킬 수도 있겠죠.

1. 알고리즘 -> 속도개선
2. 모듈화 -> 재사용성 증가
3. readbility -> 유지보수하기 좋음

셋을 모두 충족시키기는 힘들게 마련이고,

목적에 따라 그 중에 하나를 선택하려면 골고루 고민해봐야겠다고 생각합니다.

이상 C++ 프로그래밍 초보자의 생각이었습니다.

--------------------Signature--------------------
Light a candle before cursing the darkness.

whitenoise의 이미지

What matters is not what I do, but how I do it.
I am an engineer.

jick의 이미지

사각형 출력은 O(1) memory로 충분히 할 수 있는데 2차원 배열을 사용하면 O(xsize*ysize) 만큼의 메모리를 쓰게 됩니다.

멋져(?) 보이려고 오히려 훨씬 느리고 메모리 많이 먹고 복잡한 코드를 만드는 거죠.

* 원래 코드가 맘에 안 드신다면, 일단 꼭대기의 X_SIZE, Y_SIZE를 사용자에게 입력받아서 임의 크기의 사각형을 출력해 보는 건 어떨까요? 그러면 고쳐야 될 곳이 몇 군데 나타날 겁니다.

amorette의 이미지

const int X_SIZE = 10;
라고 하신후에 밑에는
if(x == 9 || y == 0 || y == 9)
라고 하셨네요. 나중에 X_SIZE 값을 바꾸면 큰일나겠군요 ' ')//

저도 한번 샤샥...

#include &lt;stdio.h&gt;
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int i, j;
 
&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i < 10; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j = 0; j < 10; j++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(i % 9 && j % 9 ? "." : "X");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts("");
&nbsp;&nbsp;&nbsp;&nbsp;}
}

cinsk의 이미지

목적에 따라 코드도 달라지지 않을까요?

사각형 그리는 함수가 필요하다면,
width, height를 받아서 그려주는 function을 만드는 게 나을 것이고,

단지 지금 사각형을 보여주어야 된다면:

#include <stdio.h>
 
int
main(void)
{
  puts("XXXXXXXXXXX\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "X.........X\n"
       "XXXXXXXXXXX");
  return 0;
}

이 코드를 써도 될 것 같은데요?

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

snowall의 이미지

가장 빠르고 직관적인 알고리즘이 되겠군요.

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b