/*
ID: ****
LANG: C
TASK: dualpal
*/

/*#define __DEBUG__*/
#define TRUE 1
#define FALSE 0
#define MAX 100

#include 

int isDualPalindrome(int num);
int checkPalindrome(int num[], int pos);

int main()
{
	int N;
	int S;
	int i;
	int count = 0;

#ifndef __DEBUG__
	FILE *fin;
	FILE *fout;

	fin = fopen("dualpal.in","r");
	fout = fopen("dualpal.out","w");
	fscanf(fin, "%d", &N);
	fscanf(fin, "%d", &S);
#else
	printf("how many do you want to get palindromes : ");
	scanf("%d", &N);
	printf("what number do you want to palindromes that greater than? : ");
	scanf("%d", &S);
#endif

	for (i = S + 1 ; ; i++)
	{
		if (isDualPalindrome(i) == TRUE)
		{
#ifndef __DEBUG__
			fprintf(fout, "%dn", i);
#else
			printf("%dn", i);
#endif
			count++;
		}
		if (count == N) break;
	}

#ifndef __DEBUG__
	fclose(fin);
	fclose(fout);
#endif

	return 0;
}

int isDualPalindrome(int num)
{
	int i;
	int changedNum[MAX];
	int pos;
	int temp;
	int palCount = 0;
	
	for (i = 2 ; i < = 10 ; i++)
	{
		pos = 0;
		temp = num;

		do
		{
			changedNum[pos++] = temp % i;
		} while(temp = temp / i);

		if (checkPalindrome(changedNum, pos) == TRUE)
		{
			palCount++;
			if (palCount >= 2)
			{
				return TRUE;
			}
		}
	}
	
	return FALSE;
}

int checkPalindrome(int num[], int pos)
{
	int i;

	for (i = 0 ; i < = pos / 2 ; i++)
	{
		if (num[i] != num[pos-i-1])
		{
			return FALSE;
		}
	}

	return TRUE;
}

주어진 수보다 큰 수 중에서 2~10진수로 표현했을때 두번 이상 palindrome(회문) 이 되는 수를 구하는 문제였다. 상당히 어렵게 생각하고 있었는데 실제로 해보니 의외로 쉽게 풀린 문제다.

'Developing' 카테고리의 다른 글

PHP에서 MySQL 다중 연결시 조심할 것  (0) 2008.12.30
USACO Training - Milking Cows  (0) 2007.11.24
파이썬 문자열 뒤집기  (0) 2007.11.17
  1. portupgrade 설치하기
    # cd /usr/ports/sysutils/portupgrade (바뀌기 이전 디렉토리)
    # cd /usr/ports/ports-mgmt/portupgrade (새로 바뀐 디렉토리)
    # make install clean

  2. cvsup 수행하기
    portupgrade를 수행하기 전에는 반드시 cvsup을 먼저 수행해야 합니다..
    링크참조 : cvsup 설치 및 업데이트

  3. 포트 데이터베이스 업데이트 하기
    # /usr/local/sbin/portsdb -Uu 또는
    # /usr/local/sbin/portsdb -Fu

    -F 옵션은 공식 싸이트에서 최신 INDEX파일을 받아와 포트 데이터베이스 파일인 INDEX.db파일을 생성합니다. 그러나 -U옵션은 make index를 실행하여 생성하기 때문에 오랜 시간이 걸립니다. 만약  /etc/make.conf에 특정 의존관계에 대한 매크로를 생성했다면 -U옵션을 이용하여 생성해야 합니다.
    일반적으로는 portsdb -Fu를 사용합니다.

  4. 업그레이드가 필요한 포트의 리스트 보기
    /usr/local/sbin/portversion -l "<"

  5. 업그레이드 수행하기
    /usr/local/sbin/portupgrade -arR

    업그레이드를 수행하기전에 /usr/posts/UPDATING 파일의 내용을 확인합니다. 추가적으로 수행해 주어야 하는 명령이 있을 경우가 있으며 따르지 않을 경우에는 업그레이드가 제대로 수행되지 않는 경우도 있습니다.

  6. 업그레이드 후 패키지 레지스트리 업데이트하기
    # /usr/local/sbin/pkgdb -F

    만약 업그레이드를 실패하였다면 다음 명령을 이용하여 강제로 업데이트합니다.
    # /usr/local/sbin/pkgdb -fu

'Operating' 카테고리의 다른 글

파이썬 모듈 설치  (0) 2007.12.24
리눅스용 네이트온 오픈 베타 시작  (0) 2007.09.23
구글 패키지에 스타오피스 8 추가  (0) 2007.08.18
/*
ID: ****
LANG: C
TASK: milk2
*/

/*#define __DEBUG__*/
#define MAX 1000000

#include 

int main()
{
	int N;
	int start, end;
	int **time;
	int count = 0;
	int modified = 0;
	int i,j;
	int milkTime = 0;
	int restTime = 0;
	int temp;

#ifndef __DEBUG__
	FILE *fin;
	FILE *fout;

	fin = fopen("milk2.in","r");
	fout = fopen("milk2.out","w");
	fscanf(fin, "%d", &N);
#else
	printf("input the number of farmers : ");
	scanf("%d", &N);
#endif

	time = (int**)malloc(sizeof(int*)*N);

	for(i=0 ; i < N ; i++)
	{
		time[i] = (int*)malloc(sizeof(int)*2);
#ifndef __DEBUG__
		fscanf(fin, "%d %d", &start, &end);
#else
		printf("input start time and end time.n[start time] [end time]n");
		scanf("%d %d", &start, &end);
#endif
		for (j=0 ; j < count ; j++)
		{
			if (start <= time[j][1] && end >= time[j][1])
			{
				time[j][1] = end;
				modified = 1;
			}
			if (end >= time[j][0] && start < = time[j][0])
			{
				time[j][0] = start;
				modified = 1;
			}
		}

		if (modified == 0)
		{
			time[j][0] = start;
			time[j][1] = end;
			count ++;
		}
		modified = 0;
	}

	for (i=0 ; i < count ; i++)
	{
		for (j=0 ; j < count ; j++)
		{
			if (time[i][0] <= time[j][1] && time[i][1] >= time[j][1])
			{
				time[j][1] = time[i][1];
			}
			if (time[i][1] >= time[j][0] && time[i][0] < = time[j][0])
			{
				time[j][0] = time[i][0];
			}
		}
	}

	for (i=0 ; i < count ; i++)
	{
		temp = time[i][1] - time[i][0];
		if (temp > milkTime)
		{
			milkTime = temp;
		}
	}

	for (i=0 ; i < count ; i++)
	{
		temp = MAX;
		for (j=0 ; j < count ; j++)
		{
			if (time[j][0] > time[i][1] && temp > time[j][0])
			{
				temp = time[j][0];
			}
		}

		if (temp == MAX)
		{
			continue;
		}

		temp = temp - time[i][1];

		if (temp > restTime)
		{
			restTime = temp;
		}
	}

#ifndef __DEBUG__
	fprintf(fout, "%d %dn", milkTime, restTime);
	fclose(fin);
	fclose(fout);
#else
	printf("the longest continuous time of milking : %dnthe longest idle time : %dn", milkTime, restTime);
#endif
	return 0;
}

매번 뻔한 코딩만하다보니 문제해결능력이 많이 떨어졌다는 것을 느낀다. 이번 문제는 여러 젖소가 우유를 짜는 시각이 주어지고, 최소한 한 젖소에서 우유를 짜는 가장 긴 시간과 전혀 우유를 짜지 않는 가장 긴 시간을 구하는 문제였다.

최소한 한 젖소에서 우유를 짜는 가장 긴 시간은 금새 구할 수 있었지만, 우유를 짜지 않는 가장 긴 시간을 구하는 것은 쉽게 나오지 않았다.

'Developing' 카테고리의 다른 글

USACO Training - Dual Plindromes  (0) 2007.12.15
파이썬 문자열 뒤집기  (0) 2007.11.17
이클립스에서 EUC-KR 문서 이용  (0) 2007.11.08
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

리눅스용 네이트온이 드디어 오픈 베타로 공개되었다. 이미 pidgin용 플러그인이나 JateOn으로 리눅스에서도 네이트온을 이용할 수 있었지만, 그래도 공식(?)적으로 리눅스를 지원하는 클라이언트가 나왔다는 것이 의미있는 일이라고 생각한다.

리눅스용 네이트온은 여기에서 받을 수 있으며, 앞으로 KLDP.NET과 같은 오픈소스 개발 사이트에 올려둘 계획이라고 한다.

추가로 KLDP의 이 글타래의 댓글을 보면 몇몇 분들이 수고하셔서 우분투와 RPM 패키지로도 만들어서 공개해놓은 것이 있다.

'Operating' 카테고리의 다른 글

FreeBSD 업그레이드  (0) 2007.12.14
구글 패키지에 스타오피스 8 추가  (0) 2007.08.18
부요기반 리눅스에 subversion + trac 설치  (0) 2007.07.23

구글에서 배포하는 소프트웨어 패키지인 '구글 패키지'에 SUN의 오피스 슈트인 '스타스위트 8'이 추가되었다.

'스타스위트 8'은 오픈 소스 오피스 슈트인 '오픈 오피스'의 기반이 된 소프트웨어로 오픈 오피스와 거의 비슷한 기능을 제공하지만, 상용 버전인 만큼 폰트 등의 추가 요소가 포함되어 있다고 한다.


구글 패키지 페이지를 통해서 설치할 수 있으며, '구글 업데이터'가 이미 설치되어 있다면, 이를 이용하여 편리하게 설치할 수 있다.

부요 데스크탑에는 서버 패키지가 존재하지 않는다. 따라서 subversion과 trac을 설치하려면 저장소를 이용한 설치를 해서는 않되고, 별도로 패키지를 구해서 설치해야한다.


1. subversion 설치

부요 데스크탑은 페도라 코어 5 기반이기 때문에 페도라 코어 5 패키지를 받아서 설치하면 이상없이 설치된다. 단, 설치시에 libapr과 libpq에 대한 의존성이 있기 때문에 이들 패키지도 함께 설치해줘야한다.


2. trac 설치

kldp.net에 등록된 trac 한글 번역 프로젝트에서 패키지를 다운로드 받아서 설치하면 된다. 단 trac의 경우 webserver 가 의존성이 걸려있으므로 spec 파일을 수정하여 다시 패키징해도 되겠다.

 - 소스패키지

 - 바이너리 패키지


3. trac 설정

 - subversion 저장소를 만듭니다.
svnadmin create --fs-type fsfs [subversion 저장소 이름]
 - trac 저장소를 만듭니다.
trac-admin [트랙 저장소 이름] initenv


4. trac 서버 실행

 - 다음과 같은 식으로 서버를 실행합니다.
tracd --port 8080 [trac 저장소 경로] 1>&2 2>> [로그파일 이름] &
혹은
tracd --port 8080 --auth *,[패스워드파일 이름],trac [trac 저장소 경로] 1>&2 2>> [로그파일 이름] &

 - 패스워드 파일은 다음 파이썬 코드로 만들수 있다.
from optparse import OptionParser
import md5

# build the options
usage = "usage: %prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("-u", "--username",action="store", dest="username", type = "string",
help="the username for whom to generate a password")
parser.add_option("-p", "--password",action="store", dest="password", type = "string",
help="the password to use")
(options, args) = parser.parse_args()

# check options
if (options.username is None) or (options.password is None):
parser.error("You must supply both the username and password")

# Generate the string to enter into the htdigest file
realm = 'trac'
kd = lambda x: md5.md5(':'.join(x)).hexdigest()
print ':'.join((options.username, realm, kd([options.username, realm, options.password])))

그동안 리눅스에서 네이트온을 사용하려면 JateOn 이나 pidgin용 네이트온 플러그인을 사용해야만 했다. 그리고, 네이트에서 리눅스용 클라이언트를 개발하고 있다는 소식이 들려오더니 결국 클로즈 베타로 클라이언트가 나오는 모양이다.



사실 라이센스 문제나 100% 동작을 보장하지 못한다는 점때문에 그렇지 그동안 리눅스에서 네이트온 사용시에는 JateOn 만으로도 충분하다고 생각했고, 메신저를 많이 사용하는 편이 아니기때문에 많이 기대는 되지 않는다. 하지만, 리눅스나 맥OS를 사용하면서 네이트온을 주로 사용하는 사람이라면 유용하겠지...

여러 파일에서 특정 문자열을 찾아서 바꿔야할때가 있다. 이걸 일일히 한다는 것은 매우 비생산적인 일이다. 윈도우즈같으면 검색을 사용하거나 이런 기능을 제공하는 에디터 프로그램 등을 찾아봐야하겠지만, 리눅스(유닉스)에서는 자잘한 유틸리티들의 조합이나 스크립트 등을 통해서 쉽게 해결할 수 있다.

  • txt 확장자를 가진 파일들에서 문자열 검색하기
    find . -name "*.txt" -print0 | xargs -r -0 grep -l [문자열]
  • 문자열을 치환하는 스크립트
    #!/bin/bash
    #특정 디렉토리에 있는 모든 파일에서 일치하는 문자열을 모두 찾아 바꾸기.
    
    if [ $# -ne 2 ]
    then
    echo "사용법 'basename $0' find_string replace_string [directory]"
    exit 65
    fi
    
    if [ -n "$3" ]
    then
    directory=$3 # 디렉토리 이름이 인자로 주어질 경우...
    else
    directory=$PWD # 아니면 현재 디렉토리에 대해서.
    fi
    
    #for file in $directory/*
    for file in $(find . -type f -name '*' | sort )
    do
    if [ $0 != $file ];then
    IsMessage=$(grep "$1" -c $file)
    # echo $file
    # if [ $IsMessage = 0 ]; then
    # echo $file No Message
    # else
    # echo $file Message
    if [ $IsMessage != 0 ]; then
    cp $file $file.ori
    sed -e "s%$1%$2%" $file > $file.tmp
    echo $file에서 찾아 바꾸기를 하였습니다.
    mv "$file.tmp" $file
    fi
    fi
    done
    
    exit 0
  • find와 perl을 이용한 문자열 치환
    find . -type f -exec perl -pi -e 's|test|TESTING|g' {} ;
  • VIM을 이용한 치환
    1. vim 실행
      vim `find . -type f`
    2. 실행후
      :set hidden
      
      :argdo %s/바꾸기전문자열/바꾼후문자열/gc
    3. 저장
      :wall
  • find와 sed를 이용한 스크립트
    #!/bin/bash
    for i in `find . -name "*" -print`
    do
    sed -e s/test/TESTING/g $i > $i.old
    mv $i.old $i
    done

'Operating' 카테고리의 다른 글

리눅스용 네이트온 클로즈 베타  (0) 2007.07.22
부요 기반 리눅스에서 DVD 타이틀 보기  (0) 2007.07.05
우분투에서 DVD 보기  (0) 2007.07.04

+ Recent posts