'컴퓨터/프로그래밍'에 해당되는 글 37건

  1. 2007.02.10 [문제] 초등학생도 풀만한 기초 문제 – 3 : 삼각형 변형 2 (2)
  2. 2007.01.16 [문제] 초등학생도 풀만한 기초 문제 – 2 : 삼각형 변형 1 (4)
  3. 2007.01.15 [강좌] 초등학생도 풀만한 기초 문제 – 1 : 삼각형 기본 [해설] (2)
  4. 2007.01.13 [강좌] 초등학생도 풀만한 기초 문제 – 1 : 삼각형 기본 [문제] (2)
  5. 2007.01.12 간단한 강좌 기획 중~~ (2)
  6. 2006.05.12 스레드를 이용한 병렬처리 프로그래밍 (2)
  7. 2006.04.09 알고리즘에 따른 속도차이 (4)

[문제] 초등학생도 풀만한 기초 문제 – 3 : 삼각형 변형 2

음, 해설 쓰기 엄청 귀찮아서 그냥 문제만 내렵니다 -_-;;
그럼 본론으로 들어가서~

다음과 같은 결과값을 화면에 출력하는 프로그램을 작성하세요.

    *
   **
  ***
 ****
*****

조건 1. 반복문 3개, 출력문 3개, 변수 2개만을를 사용할 것
조건 2. 최소한의 연산만으로 작동 시킬 것.

이번에는 조금 어려워 졌네요. 하지만 조건을 잘 읽어보면 힌트를 얻을 수 있으니 잘 보세요^^
그리고 소스 공개하면... 미워할꺼에요!

예고] 다음 시간에는 직삼각형의 마지막 문제입니다. 열심히 공부하세요 ^^.

Trackback 1 Comment 2
  1. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.02.10 15:39 address edit & del reply

    귀하는 차단?
    printf(" *\n *\n *\n *\n*\n";);

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.02.10 16:01 address edit & del

      이제 재미 없다...

[문제] 초등학생도 풀만한 기초 문제 – 2 : 삼각형 변형 1

다음과 같은 결과값을 화면에 출력하는 프로그램을 작성하세요.

*****
****
***
**
*

조건 1. 반복문 2개, 출력문 2개, 변수 2개만을를 사용할 것
조건 2. 최소한의 연산만으로 작동 시킬 것.

크게 변한 것이 없는 문제! 저번 시간에 열심히 공부한 착한 학생은 쉽게 풀 수 있을 거에요 ^^
참, 이번에도 소스 올리는건 금지 에요~ 아셨죠?.

Trackback 1 Comment 4
  1. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.01.17 01:45 address edit & del reply

    printf("*****\n****\n***\n**\n*\n";);

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.17 02:13 address edit & del

      1달 뒤에 오면 너한테 맞을만한 문제가 나올꺼다 -_-;;;

  2. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.01.19 02:50 address edit & del reply

    한달뒤면 군대..

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.20 00:13 address edit & del

      캐안습 ㅠ.ㅠ

[강좌] 초등학생도 풀만한 기초 문제 – 1 : 삼각형 기본 [해설]

많은 프로그래밍 입문을 하고자 하는 사람들의 잘못된 습관이 어떤 프로그래밍 문제가 주어졌을 때 가장 먼저 생각하는 것이 “어떤 함수(혹은 명령어)를 쓰지?” 입니다. 그러고 함수가 생각 안나니까 “아 몰라~” 라고 그냥 포기를 하죠. 사실 함수의 사용 방법은 그렇게 잘 몰라도 됩니다. 물론 기본적이고 자주 써야 하는 것들은 잘 알아둬야 하긴 하지만 초보자 적인 입장에서는 그렇게까지는 필요하지는 않습니다. 그럼 “맨 처음 떠올려야 하는 것”은 무엇인가 라면 만들어지는 과정을 머릿속에 그려내기만 하면 됩니다.

*
**
***
****
*****

이것을 만들기 위한 방법으로 여러 방법이 있습니다. 가장 쉬운 방법은

printf("*\n**\n***\n****\n*****\n");

이거겠죠? ㅎㅎ
하지만 이것은 제대로 된 프로그램이라 보기 힘듭니다. 그럼 이것을 하나하나 풀어서 설명을 해 보겠습니다.
우선 맨 첫줄에 *가 1개가 찍혀 있습니다. 그 다음줄은 2개, 그 다음은 3개 해서 마지막에 5개가 찍혀  있습니다.

* <- 1개
** <- 2개
*** <- 3개
**** <- 4개
***** <- 5개

그럼 이것을 풀어서 C언어로 작성을 하게 되면

printf("*\n");

printf("**\n");

printf("***\n");

printf("****\n");

printf("*****\n");

이렇게 될 것입니다.
물론 뒤에 개행을 해 주는 “\n”을 잊어서는 곤란하겠죠?

다음으로 생각할 것이 전체적으로 *가 첫 줄을 제외하고 모두 1개 이상씩 출력이 됩니다. 이러한 연속 작업을 수행을 할 때 유용한 것이 반복문 입니다. 이 반복문을 이용해서 1번째 줄은 1~1까지(즉 1개만) 2번째 줄은 1~2까지(2개), … , 마지막 5번째 줄은 1~5까지(5개) 출력을 해 주게 만들어 주기만 하면 됩니다.

for(int j=1; j<=1; j++)

printf("*");

printf("\n");

for(int j=1; j<=2; j++)

       printf("*");

printf("\n");

for(int j=1; j<=3; j++)

       printf("*");

printf("\n");

for(int j=1; j<=4; j++)

       printf("*");

printf("\n");

for(int j=1; j<=5; j++)

       printf("*");

printf("\n");

이렇게 만들고 나니 어? 뭔가 반복이 된다는 느낌이 들지 않나요?
네, 바로 이러한 문장이 반복이 되죠~

for(int j=1; j<=반복될 숫자; j++)

printf("*");

printf("\n");

그럼 이것을 1번 더 반복문을 사용하여 위의 문장을 5번 반복시켜 줍니다. “반복될 숫자” 부분에 반복문에서 사용하는 변수를 이용하면 쉽게 값을 변경시켜 줄 수 있습니다.

for(int i=1; i<=5; i++)

{

       for(int j=1; j<=i; j++)

             printf("*");

       printf("\n");

}

그리고 여기서 마무리를 조금 더 더하면 우선 for문 안에 변수를 선언해 줘도 되기는 하지만 사용하기에 따라서 밖으로 빼 주는 것이 더 좋습니다.(물론 사용하기에 따라서 안에 넣는 것이 더 좋을 때도 있긴 하죠. for문이 끝나는 즉시 변수를 해방시키니 메모리를 적절히 이용할 수 있겠죠)
그래서 밖으로 빼면 이렇게 됩니다.

int i, j;

 

for(i=1; i<=5; i++)

{

       for(j=1; j<=i; j++)

             printf("*");

       printf("\n");

}

다음으로 반복문을 굳이 1부터 시작할 필요가 전혀 없습니다. 나중에 나올 배열 같은 경우에도 시작점이 0입니다. 그리고 0서부터 시작을 하면 메모리 한계 점까지 1개를 더 사용할 수 있으니 0서부터 시작하는 것이 좋습니다.

int i, j;

 

for(i=0; i<=4; i++)

{

       for(j=0; j<=i; j++)

             printf("*");

       printf("\n");

}

다음으로 부등호 기호를 쓸 때 “크거나 같을 때” 혹은 “작거나 같을 때” 같이 2번 연산을 요구하는 기호는 될 수 있으면 피하는 것이 좋습니다. 최신 컴파일러는 이 작업을 1번에 처리 할 수 있지만 구형 컴파일러는 이 작업을 2번에 걸처 처리하기 때문에 임베디드쪽 프로그래밍을 할 것이면 신경을 써 주는 것이 좋습니다.

int i, j;

 

for(i=0; i<5; i++)

{

       for(j=0; j<=i; j++)

             printf("*");

       printf("\n");

}

이렇게 되면 완성입니다! 물론 제 기준으로 손볼 것이 좀 더 있긴 하지만 이걸로도 충분합니다.
그럼 제가 만든 것을 보여 드리자면~

#include <stdio.h>

 

void main()

{

       int i=5, j;

 

       for(; i; i--)

       {

             for(j=6-i; j; j--)

                    putchar('*');

             putchar('\n');

       }

}

이렇게 되겠습니다.
최소한의 연산을 추구하다 보니 이런 결과가 나오더라고요 ^^;
임베디드 프로그래밍이나 PHP같은 스크립트 언어가 아니면 이런식으로 작성하지는 마세요~ 알아보기 힘들어요 ㅎㅎ
혹시라도 잘 모르는 부분이 있으면 댓글을 달아 주세요. 답변을 해 드리고 이해가 잘 안갈만한 부분을 수정하겠습니다.

예고] 다음에는 거꾸로 뒤집힌 삼각형을 만들겠습니다. 그럼 다음 이시간까지 안녕~~.

Trackback 0 Comment 2
  1. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.01.17 01:44 address edit & del reply

    printf("*\n**\n***\n****\n*****\n";);

    워너츄.. 역시 나에게는 이게.. 딱

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.17 02:12 address edit & del

      쿨럭!

[강좌] 초등학생도 풀만한 기초 문제 – 1 : 삼각형 기본 [문제]

다음과 같은 결과값을 조건에 맞춰 화면에 출력하는 프로그램을 작성하세요.

*
**
***
****
*****

조건 1. 반복문 2개, 출력문 2개, 변수 2개만을를 사용할 것
조건 2. 최소한의 연산만으로 작동 시킬 것.

에, 그러니까… 초등학생도 풀만한 문제라고 했죠. 너무 쉽다고 돌 던지지 마세요 ㅠ.ㅠ
아 그리고 댓글로 소스 코드 올리면 안돼요! 올리면 미워할 거에요!! (덤으로 삭제할지도)
그리고 제가 사용할 언어는 C언어로 생각하고 있습니다. C++, C#, Java, PHP등등, 현재 사용되는 거의 모든 언어의 기초적인 틀을 제공을 하고 있어서 입니다. 그러니 이 점은 좀 이해해 주세요 ^^;

예고] 다음 시간에는 이 문제를 해설해 드리도록 하겠습니다. 그럼 다음 시간까지 준비해올 것은 위 문제를 푼 답안지 입니다. ^^ 제가 만든 것과 비교하는 것도 나쁘지 않겠죠? 그럼 다음시간에 만나요~~.

Trackback 0 Comment 2
  1. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.01.15 04:21 address edit & del reply

    올리고.. 싶다..

    #include <stdio.h>

    ... 이하 생략..

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.15 06:31 address edit & del

      ㅎㅎㅎ
      내가 만든거 보면 아마 어처구니 없을꺼다 ㅎㅎ

간단한 강좌 기획 중~~

아무래도 방학이고 하니 제 능력 안에서 할 수 있는 강좌를 하나 할 생각입니다.
대상은 조금 능력 좋은 초등학생부터 늦어서라도 한번 해보고자 하는 대학생까지를 염두 해 두고 있고요. 그럼 앞을 할 강좌는 무엇이냐~

그것은 “초등학생도 풀만한 간단한 프로그래밍 문제들” 입니다.

아무래도 제 수준이 수준인지라 고급 쪽은 손을 못대겠고요 ^^; 제가 고등학교때 보던 문제 10가지 정도 해서 단계별로 할 생각입니다. 아마 웬만한 중, 고등학생이나 대학생들은 그냥 우습게 넘겨버릴 수준이긴 하지만 제 수준이 이 정도라 이걸로 하겠습니다 ㅎㅎ

우선 구성은 크게 ‘문제’ 편과 ‘해설’ 편으로 나누겠습니다. ‘문제’편에서는 별 말 없이 “이것을 만들어 보시오”라는 느낌으로 작성할 예정입니다. 그리고 ‘해설’편은 이것을 푸는 방법을 설명할 생각입니다. 아마 소스 코드 같은 것은 안쓰거나 조금 특이한 방식으로 표기를 하는 쪽으로 할 지도 모르겠습니다. 아니면 아에… C, C++, Java, Basic 이렇게 4개의 언어로 모두 작성할 지도 모르고요 ^^;

어째튼 관심이 있으시면 댓글을 달아 주세요~ 뭐, 없어도 진행하겠지만요 -_-;; 단, 댓글이 달리면 더 많은 내용이 나올지도 모르죠 ㅎㅎㅎ

예고] 다음에 할 문제는 기초 문제 중의 기초인 삼각형 출력하기 문제입니다. 예습할 공부는 변수의 사용 방법, For문의 사용 방법, 문자 출력 함수 사용 방법, 문자&숫자 입력 함수등을 공부해 오시면 됩니다. 그럼 다음 시간까지 열심히 공부하세요~~

Trackback 0 Comment 2
  1. Favicon of http://signpen.net BlogIcon 싸인펜 2007.01.13 02:53 address edit & del reply

    저요저요!!
    관심이 있습니닷!!
    참여를 원합니다~~ +_+)=b

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.13 06:26 address edit & del

      저보다 고급 프로그래밍을 하시는 분 께서 이렇게 관심을 가져 주시다니...
      제가 너무 글을 거창하게 썼나봅니다 ㅠ.ㅠ

스레드를 이용한 병렬처리 프로그래밍

21세기에 들어와서 한없이 올라갈 것만 같았던 CPU클럭의 한계점이 들어남에 따라 CPU제작 업체들이 다른 길을 선택하게 되었습니다. 그것은 바로 Multi Core CPU이고 AMD에서는 Opteron, Athlon 64-FX X2, Athlon 64 X2 제품들과, Intel의 Xeon, Pentium D, Core Duo등이 현재 코어를 2개 넣은 Dual Core 제품이고 앞으로 Quad Core등 2의 배수만큼의 코어를 가진 제품이 천천히 나오게 될 것이며, 좀더 빠른 연산속도를 낼 수 있게 될 것입니다.

하지만 CPU의 코어가 여러 개가 늘어난다고 빨라지는 건 아닙니다. 그에 따른 프로그래밍 기법도 바뀌어야 제대로 된 속도를 누릴 수 있게 되는데요, 그 방법은 저도 모릅니다 ^^;;;
하지만 자바책을 보다 보니 재미있는 것이 있더라고요 바로 Thread(스레드) 라는 것인데 이 스레드는 프로그래밍에 있어서 병행처리(한번에 여러 작업을 한꺼번에 처리하는 것 처럼 보이는것)가 가능하게 해 주는 것입니다. 멀티테스킹과 연관을 지어 생각하시면 더욱 쉽게 이해가 가실 겁니다. 하지만 이 스레드가 멀티코어 CPU쪽으로 오면 어떻게 될까 싶어서 실험을 하고 싶지만 저희 집 컴퓨터가 싱글코어입니다 -_-;;; 그래서 듀얼코어 CPU를 가진 사람이 있나 싶어서 생각을 해 봤는데 주위에는 없더군요… 하지만, 다시 생각해보니 Intel에서 가상적으로 싱글코어를 듀얼코어처럼 보여지게끔 해 주는 기술을 가진 CPU를 발매를 했었습니다. 그건 Pentium 4 스리즈의 HyperThreading 인데요 Pentium 4중에서 Northwood C 와 Prescott코어에, Dual Channel Memory가 지원하는 제품이면 모두 지원을 합니다. 바로 이 펜티엄 4가 우리 학교에 널렸더군요 -_-;;; 어째튼 나름대로 듀얼코어라 Java로 스레드를 구현한 뒤, 학교에서 실험했습니다.

소스

스레드를 1개만 생성해서 돌린 결과입니다.
예상대로라면 한쪽 그래프만 꽉 차야 정상이지만 가상 멀티코어라서 그렇지 않은 것 같습니다. 하지만 작업량은 50% 정확히 나옵니다.

스레드를 2개 생성해서 돌린 결과입니다.
역시 100%가 나오면서 두 그래프 모두 꽉 찼습니다.

이것이 왜 이렇게 되느냐… 특별히 스레드에서 병렬처리를 지원하는 건 아닙니다. 하지만 이 스레드를 사용함으로써 운영체제가 알아서 분배를 해주기 때문에 둘로 나눠서 처리를 하는 것입니다. 보기엔 그다지 안 어려워 보일지 모르지만 실제론 상당히 까다롭습니다. 그리고 실제 병렬처리 프로그래밍에서 이 스레드를 사용하는 것인지는 정확히 모르겠습니다. 어째튼 지금 상황에서 병렬처리 프로그래밍을 익히게 되면 분명 쓸모 있을 것 같습니다. 다음에 이 스레드를 이용해서 만든 멀티코어용 마방진 프로그램을 공개하도록 하죠 ^^

Trackback 0 Comment 2
  1. Favicon of http://www.signpen.pe.kr BlogIcon 싸인펜 2006.05.29 22:25 address edit & del reply

    지금 학교 전공과목 수업으로 java의 스레드 관련된 부분을 배우고 있습니다.
    화현님께서 이 글을 쓰셨을때만 해도 스레드에 대해 전혀 모르고 있다가 이제서야 포스팅의 내용을 이해 할 수 있게 되었습니다..;;

    제가 좀 버퍼링이 걸려요...ㅎㅎㅎ

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2006.05.30 12:55 address edit & del

      제가 글을 잘 못썼다는 결론이 나오는군요...OTL
      앞으로는 좀더 이해하기 쉽게 쓰도록 하겠습니다 ㅠ.ㅠ

알고리즘에 따른 속도차이

요즘 객체지향 프로그래밍을 공부를 하고 있는데 문득 “같은 목적의 프로그램이지만 라인과 코딩숫자가 다를 경우의 속도차이는 어떠할까?”라는 궁금 점이 들더군요.
그래서 최근 배우고 있는 Java를 이용해서 홀수 마방진 프로그램을 만들었습니다.

첫 번째 알고리즘은 보통 사람들이 많이 구현하고, 제가 고등학교 때 구현했던 알고리즘입니다.


그림에서 보시다시피 맨 처음 시작은 상단의 정 중앙에서 시작합니다. 그 뒤 우측 위쪽으로 1칸씩 이동을 하며 만약 공간을 벗어났을 경우 벗어난 곳의 반대쪽에 지정을 합니다. 그리고 지정한 곳에 숫자가 있으면 이전 곳의 아래를 지정하는 순으로 만들어지게 됩니다.

소스

두 번째 알고리즘은 첫 번째 알고리즘의 기초가 되는 알고리즘인데 제가 오늘 안 돌아가는 머리 굴려가며 구현한 알고리즘입니다.


지정된 공간에서 벗어난 지점을 포함해서 대각선으로 숫자를 넣은 뒤 벗어난 지역의 숫자를 반대편으로 넣는 방식으로 만들어집니다.

소스

두 알고리즘의 결과는 약간 다르지만 두 개 모두 같은 목적을 가진 알고리즘입니다.

각 알고리즘별 출력 결과


이제 이 두 개의 알고리즘을 놓고 속도, 컴파일 시 용량을 측정해 보겠습니다.

속도 측정은 999 * 999짜리 마방진을 100번 만들어내는 속도로 측정을 했습니다.

첫 번째 결과

두 번째 결과


두 결과 모두 0.5초, 0.8초 차이로 두 번째 알고리즘의 승리입니다.

그럼 컴파일 시 용량이 어떻게 되는지 알아보겠습니다.


18바이트 차이로 두 번째 알고리즘의 승리군요.

알고리즘 선택에 따라 이렇게 미묘한 차이가 있을 수 있다는 것을 이번 실험에서 알아낼 수 있었습니다. 하지만 이 미묘한 차이가 쌓이고 쌓이면 엄청나한 차이가 있을 수 있다는 사실을 잊어서는 안될 것 같습니다.

여기서 보너스~

두 번째 알고리즘을 구현하기 위해 머리를 싸맸던 흔적을 공개하겠습니다 >.<

단 한줄 때문에 이런 삽질을...

Trackback 0 Comment 4
  1. Favicon of http://www.signpen.pe.kr BlogIcon 싸인펜 2006.04.10 03:24 address edit & del reply

    자바로 마방진을 구현하는 것에 대해선 생각해 본적이 없었는데, 글을 보고 관심이 생겨버려 흥미 있게 봤습니다^^
    글 중에서 속도를 측정했던 부분은 마방진 프로그램 내부에 코드를 추가 하신 건가요, 아니면 따로 측정하는 프로그램이 있는 건가요??

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2006.04.10 07:48 address edit & del

      제가 간단한 코딩으로 넣은것입니다.
      방법은 "실행 후 시간 - 실행 전 시간"으로 단위는 1/1000초입니다.
      예전에 C로 게임짰을때 많이 써먹은 방법입니다 ^^;

  2. Favicon of http://rukxer.net/root/ BlogIcon Rukxer 2006.04.11 22:19 address edit & del reply

    씨부럴 우리는 객체랍시고 C++하는데 이것도 조낸 머리에 쥐난다

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2006.04.12 01:03 address edit & del

      C++ 최강이죠 ㅠ.ㅠ
      포인터에 객체지향까지
      사람 골머리 썩히는것의 집합체 ㅠ.ㅠ