s[::-1]

저걸로 끝!

'Developing' 카테고리의 다른 글

USACO Training - Milking Cows  (0) 2007.11.24
이클립스에서 EUC-KR 문서 이용  (0) 2007.11.08
Visual C++ 프로젝트 정리하기  (0) 2007.05.15

이클립스에서 EUC-KR 문서를 사용하기 위해서는 다음과 같이 하면된다.

  1. 파일을 오른쪽 클릭
  2. Properties 선택
  3. Resource - Text file encoding 에서 Other 선택
  4. EUC_KR 을 써넣는다.

'Developing' 카테고리의 다른 글

파이썬 문자열 뒤집기  (0) 2007.11.17
Visual C++ 프로젝트 정리하기  (0) 2007.05.15
작성일자가 4월 1일인 RFC  (0) 2007.04.14
보관할 파일들
  • dsw, dsp 파일은 프로젝트 파일로 꼭 있어야하는 파일이다.
  • res 폴더는 리소스 폴더로 꼭 있어야한다.
  • 기타 소스파일 & 헤더파일


삭제할 파일들
  • plg, ncb, opt, clw 파일은 그때 그때마다 생성되는 파일이므로 삭제해준다.
  • Debug, Release 폴더는 빌드 결과물이 들어간다.

'Developing' 카테고리의 다른 글

이클립스에서 EUC-KR 문서 이용  (0) 2007.11.08
작성일자가 4월 1일인 RFC  (0) 2007.04.14
파이의 정의  (0) 2007.04.03

IETF(Internet Engineering Task Force,국제인터넷표준화기구)에서 나온 RFC중 4월 1일에 작성된 문서는 유심히 볼 필요가 있다. 제목만 봐도 좀 이상하지만(예를 들면 SONET to Sonnet Translation이라든지...), 농담조의 내용을 진지하게 적어놓은 센스가 대단하다. 특히, RFC 1149의 경우에는 실제로 구현해본 사람도 있다고 한다.

이런 만우절 RFC는 위키백과에 잘 나와있다.

'Developing' 카테고리의 다른 글

Visual C++ 프로젝트 정리하기  (0) 2007.05.15
파이의 정의  (0) 2007.04.03
The Java Programming Language - 1일차  (0) 2007.02.03

프로그래밍을 하다보면 파이값을 이용할 일이 꽤 있다. 흔히 다음과 같이 정의해서 사용할 것이다.

PI = 3.14

하지만, 그다지 정확한 값이 아니고, 정확한 값을 넣기 위해서 매번 찾아보는 것은 번거로운 일이다.(물론 소수점 이하 10자리 이상을 항상 외우고다니는 일부들에게는 해당되지 않는다 :-) ) 그럴때는 다음과 같이 간단하고 정확한 파이값을 정의할 수 있다.(C언어 기준)

PI = atan(1.0) * 4

'Developing' 카테고리의 다른 글

작성일자가 4월 1일인 RFC  (0) 2007.04.14
The Java Programming Language - 1일차  (0) 2007.02.03
USACO Training - Friday the Thirteenth  (0) 2006.09.12
The Java Programming Language 1~3장

1. 자바의 개요
2. 클래스와 객체
3. 클래스 확장

<용어 정리>
  • 클래스(Class)
  • 객체(Object)
  • 인스턴스(Instance)
  • byte code
  • native code


- 클래스 멤버
  • 필드 : 클래스/객체에 속하는 데이터 변수 -> C++ : 멤버 변수
  • 메소드 : 필드의 상태를 조작하기 위한 수행문으로 구성됨 -> C++ : 멤버 함수

- 첫번째 예제

class Hello world {
    public static void main( String[] args ) {
        System.out.println("Hello, World");
    }
}
    - header
    - signature
    - declaration


<기본 데이터 타입>


  • boolean : true / false
  • char : 16 bits 유니코드 2.1문자
  • byte : 8 bits 정수
  • short : 16 bits 정수
  • int : 32 bits 정수
  • long : 64 bits 정수
  • float : 32 bits 부동소수점표현
  • double : 64 bits 부동소수점표현

<Named Constant>


class Suit {
    final static int CLUB = 1;
    final static int DIAMONDS = 2;
    final static int HEARTS = 3;
    final static int SPADES = 4;
}

<주석
>

  • // : 한줄 주석
  • /* ... */ : 구역 주석
  • /** ... */ : 문서 주석(doc comment) -> javadoc 에서 사용

<제어문 / 반복문>

  • for
  • while
  • if - else
  • switch
  • do - while

<연산자>

  • ++ , += , -= , *= , /=
  • & , | , ^
  • || , &&

<클래스 / 객체>


 - 객체 변수 / 클래스 변수
  • instance variable
class Point {
    public double x, y;
}
Point Left = new Point();
Left.x = 1.0;
  • class variable
class Point {
    public static int cnt;
}
Point Right = new Point();
Point.cnt = 1;
  • 메소드의 경우에도 적용됨(스태틱/클래스 메소드)


 - 클래스의 상속

class Point {
    public double x, y;
}
class Pixel extends Point {
    Color color;
    int col;

    public void clear() {
        super.clear();
        this.col = 0;
        color = null;
    }
}
  • 상속은 extends를 이용해서 한다.
  • 다중상속은 허용하지 않는다.
  • this : 현재 객체 참조
  • super : 상위 클래스참조

 - 필드(Fields)

     - 접근한정자 -
  • public : 모든 클래스에서 접근가능
  • private : 해당 클래스에서만 접근
  • protected : 동일한 패키지, 해당 클래스, 서브클래스에서 접근 가능
  • package : 동일한 패키지, 해당 클래스에서 접근가능(기본값)
  • static
  • final : 초기화되지 않을 경우 컴파일 X
  • transient
  • volatile


 - 메소드(method)
  • 접근한정자
  • abstract : declaration X
  • static
  • final
  • strictfp(strict floating point) : 정밀하게 부동소수점 연산
  • call by value 로 수행
  • main : public static void
  • native : 다른 언어로 만들어진 메소드
  • overloading : 같은이름 / 다른 signature
  • overriding : 동일한 메소드를 서브클래스에서 덮어씀


 - 클래스(Class)
  • public : 하나의 소스파일에 파일이름과 이름이 같은 하나의 public 클래스 존재
  • abstract : 추상 메소드 포함 - 인스턴스 X
  • final : 서브클래스 X
  • strictfp


 - 생성자

  • 예제
class A {
    A() {
        ...
    }
}
  • 초기화블록
class A {
    {
        ...
    }
}
  • static block
class A {
    static {
        ...
    }
}

<Exception>

  • 새로운 예외 정의
class BadDataSetException extends Exception { }
  • 사용
class A {
    public int get(int input)
        throws BadDataSetException {
        ...
        ...
        throw new BadDataSetException();

<etc>

 - 배열
  • 배열의 생성
int[] = new int[10];

 - String 객체

 - Package
  • 패키지 이름의 중복을 막기위한 코딩 규약 (~.~.~)
  • 패키지에 소속시키기
package net.gnuvill.game;
  • 패키지의 사용
import java.util.*;

 - 유니코드

    자바는 유니코드를 사용하기때문에 변수이름으로 유니코드를 사용할 수 있다.

'Developing' 카테고리의 다른 글

파이의 정의  (0) 2007.04.03
USACO Training - Friday the Thirteenth  (0) 2006.09.12
PERL에서의 웹 프로그래밍  (0) 2006.06.03

/*
ID: ****
LANG: C
TASK: friday
*/

/*#define __DEBUG__*/

#include <stdio.h>

int main()
{
    int period, last, year, leap, i;
    int day=0; // 0=Mon ... 6=Sun
    int count[7];
    for(i=0 ; i<7 ; i++)
        count[i] = 0;
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("friday.in","r");
    fout = fopen("friday.out","w");
    fscanf(fin,"%d",&period);
#else
    do{
        printf("Enter period(N years) : ");
        scanf("%d",&period);
    }while(period<=0 || period>400);
#endif

    last = 1900+period;

    for(year=1900 ; year<last ; year++)
    {
        if(year%100 == 0)
        {
            if(year%400 == 0)
                leap = 1;
            else
                leap = 0;
        }
        else if(year%4 == 0)
            leap = 1;
        else
            leap = 0;

        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+leap)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
        count[day]++;
        day = (day+2)%7;
        count[day]++;
        day = (day+3)%7;
    }

#ifndef __DEBUG__
    for(i=0 ; i<6 ; i++)
        fprintf(fout,"%d ",count[i]);
    fprintf(fout,"%dn",count[6]);
    fclose(fin);
    fclose(fout);
#else
    for(i=0 ; i<7 ; i++)
        printf("%d ",count[i]);
#endif
    return 0;
}

1900년부터 시작해서 주어진 몇년의 기간동안 날짜가 13일이 되는 요일의 수를 구하는 프로그램인데, 조금 생각하고 코딩을 했더니 결과가 너무 지저분해졌다. 게다가 1월부터 12월까지 달마다 요일을 구하는 부분에서 날짜를 미리 계산해서 넣는 만행을...;

저부분을 제대로 하자면, 각 달의 날짜수를 배열같은 곳에 저장해둔 다음, 윤년을 판단해서 윤년일 경우 2월 계산부분에 하루를 더해주고, 반복문으로 해결을 볼수 있을 듯한데, 일단 이걸로 이번문제는 통과..;;; 더 고치기가 귀찮다.

'Developing' 카테고리의 다른 글

The Java Programming Language - 1일차  (0) 2007.02.03
PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - What Time Is It?  (0) 2006.05.15

이런저런 문제들로 정신없는 와중에 새로운 일을 떠 맡았다. PHP와 펄을 이용한 간단한 웹 프로그래밍이었는데, 두가지 경우 모두 FORM을 이용해서 값을 넘겨받아야 했다. PHP의 경우는 그냥 간단히 name과 동일한 변수로 받아서 해결되었지만, 펄의 경우에는 약간 해줘야할 것이 있어서 머리가 아팠다. 아무래도 PHP처럼 원래 CGI 전용으로 나온 스크립트가 아니라서 그런가보다.

어쨌든 아래와 같은 방법으로 해결했다.

예제 : 간단한 사칙연산 프로그램

#!/usr/bin/perl

print "Content-type: text/htmlnn";
&parse;
$first = $FORM{'first'};
$second = $FORM{'second'};

print "<html><head><title>계산 결과</title></head><body>";
print "<h1>계산 결과</h1><br />";
print "<table><tr><td>더하기</td><td>";
print $first+$second;
print "</td></tr><tr><td>빼 기</td><td>";
print $first-$second;
print "</td></tr><tr><td>곱하기</td><td>";
print $first*$second;
print "</td></tr><tr><td>나누기</td><td>";
print $first/$second;
print "</td></tr><tr><td>나머지</td><td>";
print $first%$second;
print "</td></tr></table></body></html>";

sub parse {
  if($ENV{'REQUEST_METHOD'} eq "GET") {
      $buffer = $ENV{'QUERY_STRING'};
  }
  else {
      read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  }

  @pairs = split(/&/,$buffer);

  foreach (@pairs) {
      ($name, $value) = split(/=/,$_);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

      $FORM{$name} = $value;
  }
}

parse 부분이 핵심 부분인데, 거의 정형화되어있어서 다들 copy&paste한다고 한다.

'Developing' 카테고리의 다른 글

USACO Training - Friday the Thirteenth  (0) 2006.09.12
USACO Training - What Time Is It?  (0) 2006.05.15
USACO Training - Barn Repair  (0) 2006.05.09

/*
ID: ****
LANG: C
TASK: clock
*/

#define __DEBUG__

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

char* itoc(int num);

int main()
{
    char* temp;
    char time[6];
    int hour;
    int min;
    char out[100];
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("clock.in","r");
    fout = fopen("clock.out","w");
    fscanf(fin,"%s",time);
#else
    printf("Input time : ");
    scanf("%s",time);
#endif
   
    temp = strtok(time,":");
    hour = atoi(temp);
    temp = strtok(NULL,":");
    min = atoi(temp);
   
    switch(min)
    {
    case 0:
        sprintf(out,"%s o'clock",itoc(hour));
        break;
    case 15:
        sprintf(out,"Quarter past %s",itoc(hour));
        break;
    case 45:
        sprintf(out,"Quarter to %s",itoc(hour%12+1));
        break;
    default:
        if(min>45)
            sprintf(out,"%s to %s",itoc(60-min),itoc(hour%12+1));
        else
            sprintf(out,"%s %s",itoc(hour),itoc(min));
    }
    out[0]=toupper(out[0]);
#ifndef __DEBUG__
    fprintf(fout,"%sn",out);
    fclose(fin);
    fclose(fout);
#else
    printf("%sn",out);
#endif
    return 0;
}

char* itoc(int num)
{
    char* retval;
    retval = (char*)malloc(sizeof(char)*20);
   
    if(num<20)
    {
        switch(num)
        {
        case 1:    return "one";
        case 2:    return "two";
        case 3:    return "three";
        case 4:    return "four";
        case 5:    return "five";
        case 6:    return "six";
        case 7:    return "seven";
        case 8:    return "eight";
        case 9:    return "nine";
        case 10: return "ten";
        case 11: return "eleven";
        case 12: return "twelve";
        case 13: return "thirteen";
        case 14: return "fourteen";
        case 15: return "fifteen";
        case 16: return "sixteen";
        case 17: return "seventeen";
        case 18: return "eighteen";
        case 19: return "nineteen";
        default: return "";
        }
    }
    else
    {
        switch(num/10)
        {
        case 2:
            sprintf(retval,"twenty");
            break;
        case 3:
            sprintf(retval,"thirty");
            break;
        case 4:
            sprintf(retval,"forty");
            break;
        case 5:
            sprintf(retval,"fifty");
            break;
        }

        switch(num%10)
        {
        case 0:
            break;
        case 1:
            strcat(retval,"-one");
            break;
        case 2:
            strcat(retval,"-two");
            break;
        case 3:
            strcat(retval,"-three");
            break;
        case 4:
            strcat(retval,"-four");
            break;
        case 5:
            strcat(retval,"-five");
            break;
        case 6:
            strcat(retval,"-six");
            break;
        case 7:
            strcat(retval,"-seven");
            break;
        case 8:
            strcat(retval,"-eight");
            break;
        case 9:
            strcat(retval,"-nine");
            break;
        }
    }
    return retval;
}

상당히 간단한 문제였다.

'Developing' 카테고리의 다른 글

PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - Barn Repair  (0) 2006.05.09
USACO Training - Mixing Milk  (0) 2006.05.03

/*
ID: ****
LANG: C
TASK: barn1
*/

/*#define __DEBUG__*/
#define MAXSTALL1 200+1

#include <stdio.h>

int main()
{
    int max, stal, cow;
    int i, temp;
    int before = 0;
    int total = 0;
    int ival[MAXSTALL1];
    int status[MAXSTALL1];
   
    for(i=0 ; i<MAXSTALL1 ; i++)
    {
        ival[i] = 0;
        status[i] = 0;
    }
   
#ifndef __DEBUG__
    FILE *fin;
    FILE *fout;
   
    fin = fopen("barn1.in","r");
    fout = fopen("barn1.out","w");
    fscanf(fin,"%d %d %d",&max,&stal,&cow);
#else
    printf("Input max & stall & cow : ");
    scanf("%d %d %d",&max,&stal,&cow);
#endif
   
    for(i=0 ; i<cow ; i++)
    {
#ifndef __DEBUG__
        fscanf(fin,"%d",&temp);
#else
        scanf("%d",&temp);
#endif
        status[temp] = 1;
    }
   
    for(i=0 ; i<=stal ; i++)
    {
        if(status[i] == 1)
        {
            if(before != 0)
                ival[i-before-1]++;
            before = i;
        }
    }
   
    max--;
    for(i=stal ; i>0 ; i--)
    {
        if(max > 0)
        {
            if(ival[i] >= max)
            {
                total += (ival[i] - max)*i;
                max = 0;
            }
            else
                max -= ival[i];
        }
        else
            total += ival[i]*i;
    }
#ifndef __DEBUG__
    fprintf(fout,"%dn",total+cow);
    fclose(fin);
    fclose(fout);
#else
    printf("%dn",total+cow);
#endif
    return 0;
}

저번 문제와 비슷한 접근 방법으로 문제를 해결했다.

주어진 갯수의 널판지로 최소한의 길이의 널판지를 이용해서 헛간을 고치겠다는 것이 문제였다. 비어있는 칸은 반드시 고칠 필요가 없고, 소가 있는 칸만 고치면 되므로, 소가 있는 칸 사이의 넓이가 가장 넓은 곳 부터 비우는 방식으로 널판지 갯수를 맞췄다.

소가 있는 칸 번호가 반드시 순서대로 들어오는 것은 아니므로 연산이 더 필요했다.

'Developing' 카테고리의 다른 글

PERL에서의 웹 프로그래밍  (0) 2006.06.03
USACO Training - What Time Is It?  (0) 2006.05.15
USACO Training - Mixing Milk  (0) 2006.05.03

+ Recent posts