가치있는 고민일까요?
글쓴이: rainmon / 작성시간: 일, 2009/03/15 - 3:03오후
문제.
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차원 배열과 비트연산을 사용해서 만들어보려고 하는데..
이런걸 고민하는것도 가치가 있을까요?
Forums:
이걸 해결하셨으면
이걸 해결하셨으면 다음 문제로 넘어가 보는건 어떨까요?
만든 프로그램을 자꾸 뒤집는 버릇 들여놓으면 나중에 힘들더군요;;
분명히 더 좋은 방법이 있겠지만 지금 잘 동작하는 것도 의미가 있다는 것을;;;;;
저도 소타님
저도 소타님 말씀대로 이건 어째든 문제를 해결했으니 다음 진도를 나가고 싶은데..
비트연산을 활용할 만한 규칙성 같은게 보일듯 말듯 해서 어쩔까나 하고 있습니다.
이런 결과에도 나름 의미가 있다니 위로가 됩니다. ^^
고민할 가치가 충분히 있다고 생각합니다. :)
왜 알고리즘이 필요한가, 왜 Performance가 필요한가?
그리고 알고리즘과 Performance는 왜 중요한가?
의 고민이 Computer Science에는 매우 중요한 요소중의 하나이죠.
그 유명한 MIT 대학교수인 Charles E. Leiserson의 Introduction to Algorithm의 첫번째 강의를 소개합니다. (MIT의 Algorithm Open 강의입니다.)
Direct URL: http://video.google.com/videoplay?docid=-2333306016564732003
한번 시간 되실때, 들어보시면 무척 도움이 될 듯 싶습니다.
~~~~~~~~~ Signature
문제에만 충실하게 하면...
(O(n))으로 만들어서 위와 같이 할수도 있겠습니다만...
만일 문제가 NxN 이었거나, O(n)만으로 해야 한다던가, 아니면, 다른 알고리즘을 요구한다던가 하면, 좀 더 재미있고, 좀 더 나은 결과가 있을지도 모릅니다만.....
근데, 배열과 비트연산으로 한 결과물도 궁금해지네요.
~~~~~~~~~ Signature
코드의 재사용성
코드의 재사용성 (모듈화) 을 생각해보는 것은 어떨까요?
저라면,
배열생성
X 로 사각형 그리기
. 으로 사각형 안을 채우기
배열출력하기
으로 분리하여 각각 함수로 만들어보겠습니다.
타원, 직선, 곡선 등등을 그려주는 함수들의 라이브러리로 발전시킬 수도 있겠죠.
1. 알고리즘 -> 속도개선
2. 모듈화 -> 재사용성 증가
3. readbility -> 유지보수하기 좋음
셋을 모두 충족시키기는 힘들게 마련이고,
목적에 따라 그 중에 하나를 선택하려면 골고루 고민해봐야겠다고 생각합니다.
이상 C++ 프로그래밍 초보자의 생각이었습니다.
--------------------Signature--------------------
Light a candle before cursing the darkness.
What matters is not what I
What matters is not what I do, but how I do it.
I am an engineer.
2차원 배열은 비추
사각형 출력은 O(1) memory로 충분히 할 수 있는데 2차원 배열을 사용하면 O(xsize*ysize) 만큼의 메모리를 쓰게 됩니다.
멋져(?) 보이려고 오히려 훨씬 느리고 메모리 많이 먹고 복잡한 코드를 만드는 거죠.
* 원래 코드가 맘에 안 드신다면, 일단 꼭대기의 X_SIZE, Y_SIZE를 사용자에게 입력받아서 임의 크기의 사각형을 출력해 보는 건 어떨까요? 그러면 고쳐야 될 곳이 몇 군데 나타날 겁니다.
흡흡
const int X_SIZE = 10;
라고 하신후에 밑에는
if(x == 9 || y == 0 || y == 9)
라고 하셨네요. 나중에 X_SIZE 값을 바꾸면 큰일나겠군요 ' ')//
저도 한번 샤샥...
목적에 따라 코드도
목적에 따라 코드도 달라지지 않을까요?
사각형 그리는 함수가 필요하다면,
width, height를 받아서 그려주는 function을 만드는 게 나을 것이고,
단지 지금 사각형을 보여주어야 된다면:
이 코드를 써도 될 것 같은데요?
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
가장 직관적인
가장 빠르고 직관적인 알고리즘이 되겠군요.
--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com
피할 수 있을때 즐겨라! http://melotopia.net/b