2013년 11월 24일 일요일

Ahn Lab ISF2013

Ahn Lab ISF2013




매년 열리는 통합보안기업 안랩 융합 보안 전략 컨퍼런스 (AhnLab ISF)에 Track C를 다녀왔습니다.
Track C 는 차세대 보안 관제와 디지털포렌식, 온라인 사기 대응 방안을 다루는 내용이였습니다.

디지털 포렌식,

사라진 흔적까지 추적한다!
최근 피해가 늘어나고 언론화되는 APT 공격에따른 보안 위협에 대응하는 핵심 기술인 포렌식으로 사라진 흔적을 복구하여 신속하게 APT 공격에 대응할수있는 기술을 설명되고있습니다.
2008년 옥션의 APT 공격으로 시작하여 다양한 APT 공격이 언론화되어 기업들의 APT 대응방안을 강조하고있습니다.
일반적 공격과 APT 공격을 비유하자면 APT공격은 암에 비유할수있다. 탐지하기가 어렵고 시간이 얼마가 걸리든 타겟을잡은 목표의 데이터를 유출시키기위해 계속 변하는 공격을 시도합니다.




이러한 시스템 내의 공격을 파악하려면 정밀검사를 해야 하는데 시스템 안에 파일의 수는 엄청난 데이터를 가지고 있기 때문에 이러한 데이터들의 흐름을 전부 통제가 힘들다고 볼 수 있는데 그러므로 어떠한 곳도 안전하다고 볼 수는 없습니다.




APT 환경에서 부각되는 디지털포렌식이란 외부 혹은 내부에서 시작된 정보를 습득하고 분석하여 그것을 증거로 확보하는 기술로써 공격을 최대한 빠르게 인지할 수 있도록 하는 역할을 합니다. 또한 언제 공격이 시작되었는지 어떤 식으로 공격이 되었는지도 알아내어 다음 공격을 예방할 수 있도록 할 수 있습니다.

온라인 사기 대응 방안


감염을 시키려고하는 pc에서 감염이 시작되고 감염이 퍼지게됩니다. 그리고 그 감염을 시킨 관리자가 예전과 같았다면 어떠한 서버에 DDos 공격을 진행하여 막대한 양의 패킷이 흘려보낸다던가 하는 공격을 하였지만 현재는 감연되 사용자의 개인정보등을 수집하여 이러한 정보등으로 금전적 이익을 챙기는 것이 가장 중요한 목적이 되었습니다.



과거에는 이러한 사기행위를 하기위해서는 한사람의 공격자가 굉장히 열심히 시간을 들여야하였지만 이러한 것이 하나의 인프라를 구축하게되어 점점 진화하고있습니다.


A라는 곳에서 B라는 곳으로 중계 수수료를 받고 사용자의 정보를 거래하는 조직화 되어있습니다. 이러한 거래들은 사그룹화 되어 채팅방 또는 폐쇄망형태의 웹사이트로 지속적인 거래가 진행중이며 이러한 상황은 직접 참가하지않는다면 모니터링이 불가능하여 최근 몇몇기업들은 직접 사람을 투입시키고있습니다.




증가하는 이러한 공격에 따른 웹사이트 보호 방안으로는 U-OTP 디바이스 ID, 네트워크 쪽으로는 방화벽 강화 ,어플리케이션에서는 소스코드분석 및 모의 해킹이 진행되고있다

또한 정상적인 사용자와 비정상적인 사용자를 구별하는 방법을 점차 찾아가고있습니다.
이러한 방법으로는 페이지의 접근 순서를 보는 방법이 있습니다 일반적사용 자는 순차적으로 페이지에 접근하여 행동을 취할텐데 비정상적 사용사는 바로 어떠한 행위를 실행할 페이지로 접근하여 이상행동을 보입니다.

다른 방법으로는 Man In the Middle(하나의 세션에 IP가 다수인경우) 분석으로 IP,계정별로 세션을 분석하여 중복되거나 했을때 이상행동을 하는 IP를 찾는 방법입니다.


이러한 보안 시스템들이 구축되기 위해서는 빅데이터 시스템이 적용되어야합니다 로그로는 부족한 정보를 전체적인환경을 모니터링할수있도록 해주는 빅데이터 시스템으로 즉각 대응할수있도록 해주는 것이 현재 온라인사기 대응에 가장 중요한 부분이라 할수있습니다.

2013년 11월 23일 토요일

2013_07_10 KISA ICIS2013

KISA ICIS 2013

international conference on information security


남녀노소 사용하게된 인터넷의 사용성과 장점을 느끼고 더욱 발전하는 것도 필요하지만 그만큼 취약점이 점점 많아지고 이걸 의식할 필요가있다.

CEO in Cyber Security Strategies 대표의 연설 : 인터넷 문제를 의식한 지금 경제적,사회적 사이버 문제를 느끼고 정보가 부족한 점을 알았지만 시간, 비용을 문제로 발전이 늦어지고있다 이러한 문제를 뛰어넘어 사이버 문제를 극복할 노력이 필요하다. 조금만 둘러봐도 언론에 대한 위협과  *APT공격이 강화되고 점점 증가하므로 전세계가 네트워크에 연결되는 디지털 혁명을 정보보안으로 시작하여야 한다. 하지만 현재의 수준으로는 많은 돈을 들여도 우리는 그공격을 효율적으로 방어할수없습니다. 그러므로 현재의 문제를 답습하는게아니라 지금까지의 대처를 되돌아보고 반성하며 현실적 대처로 능동적행동을 해야한다.

*APT 공격 :APT(Advanced Persistent Threat)공격이란 사회공학, 컴퓨터 취약점을 이용하고 조직,사람,기술,정보 등을 통틀어 총체적 공격방식으로 개인 아니라, 정부 또는 특정 회사의 중요 정보 휙득. 정치적 목적, 사이버 테러 등을 목적으로 하는 범죄 그룹에 의해 사이트, 기업, 개인을 상대로 지속적으로 공격하는것 이러한  APT 공격에 대부분의 기업들의 대안 수준이 낮다.

APT 공격 대응책

a. 경보 시스템 강화(타겟과 공격위치 파악)
b. zero-day 를 파악하고 악성코드에 대한 지식확보
c. 다양한 백신에 대한 지식 확보
d. 내부 공격과 외부 확산 차단
e. 시뮬레이터를 이용하여 교육강화

1. 정보보호 산업 발전 종합 대책(Comprehensive Plan for Cyber Security)

현재 교육 쇼핑 다양한 문화생활이 스마트폰에의해 사이버 공간에 모든것이 옮겨가있다.
그리하여 기본적으로 사이버공간이 우리가 창조적이고 새로운 혁신의 무대라 할수있다.

사이버 공간으로 인해 오프라인 공간에서의 장애가 사이버공간으로 가는것으로 극복할수도있다.

현 사이버공간은 우리의 아이디어를 구현할수있으므로 창조적 사회라 할수있다. 하지만 이러한 사이버공간으로 오프라인공간에서 하던것이 옮겨 가므로 오프라인공간의 위협이 사이버공간으로 같이 이동했다고 볼수있다. 사이버공격이 1년동안 81%가 증가하며 400억 달러의 피해가 발생핬대.  그러한 측면에서 이러한 부분을 대처하는 보안분야가 발전하는 것을 알수있다.

(위 사진은 x축은 해커들의 수준을 나타내며 y측은 해커들의 목적을 나타낸다)

정보보안산업 분야가 전세계 10%증가 하였고 우리나라 는 전세계 평균 10%보다 높은 14%가 증가하였다. 이러한 이유는 북한과 대치중인 상황에 쳐해있으면 다양한 IT 인프라가 구축되어있어 위험에 노출되어있다.

문제점

a. 보안 산업분야가 발전하고있지만 보안상품에 비해서는 서비스 입력이 턱없이 부족하다.
(위 사진은 한국에 보안상품에 비해 서비스의 비율과 세계의 보안상품에 비한 서비스의 비율을 보여주는 사진이다.)

b. 우리나라는 빠른 인터넷을 구축하는 방면 그것에 대한 보안에 무심하였던 문제가 있었다. 미국과 우리나라의 보안산업에 대한투자의 차이는 2배 가까이 되며 우리나라가 얼마나 무심하였는지 알수있다. 그리고 최근에서야 보안분야에 관심이 생기며 발전하고있지만 전문인력이 부족한 문제점이있다.

IT 강국으로 불리는 대한민국에서 보안분야를 끓어올리기위해 새운 3가지

a. 시장확층 : 기업이 성장하고 기업이 스스로 필요성을 느껴야한다. 인터넷서비스의 취약점이 무엇인지 전문가로 인해 알고 그것을 국민에게 공개하여 국민에게 위험성을 알려야한다. 정보보호 기업들이 보다 많이 설립되고 성장할수있도록 지원

b. 전문인력 양성을 위한 교육지원 : 초중고에서 실시하여 정보보안산업을 리드할 인력을 양성한다 국방부, 국정원등에서 군복무를 해결하고 진로, 진학등을 지원

c. 기술 글로벌 경쟁력 강화 : 기업이 세계로 진출할수있도록 지원

import os

for i,j,k in os.walk('c:\\'):    //c 하위 디렉토리들을 전부 탐색
try:                              //퍼미션 문제를 위한 예외처리
f=open(i+"\\HI.txt",'a')     //파일 생성
data="I.m DG"      //파일내용
f.write(data)        //내용 적용
f.close()             //파일 닫기
except IOError:           //에러 발생시 continue
continue

2013년 5월 29일 수요일

change.py

>>> import random
>>> mem={1:"이예림",2:"이정은",3:"정윤지",4:"김동희",5:"김원태",6:"김준기",7:"김지훈",8:"노찬우",9:"박현일",10:"배원빈",11:"백지훈",12:"우덕균",13:"윤여현",14:"윤정현",15:"이우상",16:"이효찬",17:"장혜준",18:"정민혁",19:"정지민",20:"조재근",21:"최동민",22:"최예닮",23:"최재석",24:"하태훈",25:"홍성재",26:"홍정현"}
>>> f=open("c://mem.txt",'w')
>>> t=range(1,27)
>>> c=0
>>> for i in range(1,27):
b=t[random.randint(0,len(t)-1)]
t.remove(b)
data="%s "%mem[b]
f.write(data)
c+=1
if c%6==0:
f.write("\n")

>>> f.close()

2013년 3월 30일 토요일

webhacking.kr 1번


1번 들어가면 이런것이 보인다 친절하게 index.phps 라 하니 주소창뒤에 쳐준다.





빨간색 1번보면 유저레벨이 5보다 크면 풀린단다 6이넘어가면 1이랑 똑같다니 5.5정도로 설정해주자



쿠키 user_lv 값을 가볍게 바꿔준다 그리고F5 하면 끝

2013년 3월 25일 월요일

시져 암호화


#include<stdio.h>
#include<string.h>
void main()
{
char psw[100], psw2[100];
int i,a;
scanf("%s",psw);
a=strlen(psw);

for(i=0;i<a;i++)
{
if(psw[i]>87 && psw[i]<91)
{
psw2[i]=psw[i]-23;
}
else if(psw[i]>119 && psw[i]<123)
{
psw2[i]=psw[i]-23;
}
else
psw2[i]=psw[i]+3;
}
for(i=0;i<a;i++)
printf("%c",psw2[i]);
}

2013년 3월 24일 일요일

프로세스 스케줄링

각 프로세스를 얼마만큼 작동시킬 것인가를 운영 체계(OS)에서 제어하는 것



중앙 처리 장치(CPU)는 많은 프로그램(C 프로그램)을 동시에 실행해야 한다. 그러나 보통 CPU는 1대이므로 어떤 프로세스를 일정 시간 실행한 후 그 프로세스를 일시 중단하고 다음 프로세스를 다시 일정 시간 실행하는 식으로 제어를 반복한다.

---------------------------------------------------------------------------------------------

각각 스케줄링 알고리즘의 특징을 알기 전에 스케줄링의 목절을 알아보면 다음과 같은 목적을 고려해서 스케줄링 되어야 한다. 


●  공정한 스케줄링 : 스케줄링할 때 모든 프로세스들은 공평하게 취급되어야 하며 어느 프로세스도 무한정 대기 하는일이 없어야 한다. 

●  처리량 극대화 : 스케줄링할 때 프로세스들의 가능한 한 단위 시간당 처리량을 최대화 한다. 

●  응답 시간 최소화 : 대화식 사용자에게는 가능한 최대한 응답 시간을 빠르게 한다. 

●  반환 시간 예측 가능 : 시스템의 부하에 관계없이 일정한 작업은 같은 시간 내에 같은 비용으로 실행, 완료되어 반환시기를
 예측 
가능해야 한다. 
●  균형 있는 자원 사용 : 스케줄링 시 시스템 내의 자원들이 유휴 상태로 놓이지 않게 골고루 사용하게 하고, 유휴 상태의 자원을 사용하는 프로세스에게 더 나은 서비스를 제공 한다. 
●  응답 시간과 자원 이용간의 조화 : 빠른 응답 시간과 자원의 활용도를 고려하여 응용에 따라 적절하게 조화시킨다.

●  우선 순위제를 실시 : 프로세스들에게 우선순위를 부여하여 우선순위가 높을수록 먼저 실행되도록 한다. 

●  페이지 부재를 적게 발생시키는 프로세스에게 더 좋은 서비스를 해준다. 

■ 선점 스케줄링  

선점은 한 프로세스가 CPU를 점유하고 있을 때 다른 프로세스가 현재 프로세스를 중지시키고 자신이 CPU를 차지 할 수 있는 방식이다. 우선순위가 높은 프로세스가 먼저 수행 될 때 유리하고, 빠른 응답시간을 요구하는 시분할 시스템에 유용하다. 하지만
선점 때문에 많은 오버헤드를 초래한다.

□ Round robin 스케줄링

라운드 로빈 스케줄링은 FCFS (First come First service) 방식으로 각 프로세스는 같은 크기의 타임 슬라이스를 할당 받는다.
만약 프로세스가 할당 받은 시간동안 작업을 완료하지 못하면 다음 프로세스로 넘어가고 실행 중이던 프로세스는 준비 완료 리스트의 가장 뒤로 보내진다. 

라운드 로빈 방식의 특징은 다음과 같다. 
 시분할 방식의 시스템에서 효과적이다.  할당 시간의 크기는 시스템의 효과적인 동작에 절대적인 영향을 미친다. 할당 시간이 크면 FCFS 방식과 같다.  할당 시간이 작으면 자주 문맥교환이 발생하므로 오버헤드가 커진다. 

 SRT 스케줄링
준비 큐에 있는 프로세스들 중에서 가장 짧은 시간이 소요된다고 판단되는 프로세스를 먼저 수행 시킨다. 
SJF 방식에 선점 방식을 도입한 방식이라고 생각하면 편하다. 

현재 프로세스가 CPU를 할당 받아 사용중이더라도 남은 처리 시간이 더 짧다고 판단되는 프로세스가 준비 큐에 생기면 언제라도 실행 중인 프로세스는 선점될 수 있다. 또한 수행 중인 각각의 작업들의 실행 시간을 추적 보유하고 있어야 한다. 
□ MLQ 스케줄링

작업들을 여러 종류의 그룹으로 나누어 여러개의 큐를 이용하는 스케줄링 기법이다. 그룹화된 작업들은 각각의 준비 큐에 넣어서 각 큐의 독자적인 스케줄링 알고리즘에 따라서 CPU를 할당 받는다.

● 다단계 큐 알고리즘은 준비 상태 큐를 여러 종류로 분할해 둔다.
● 각 큐는 자신만의 독자적인 스케줄링을 가지고 있다.
● 각각의 서로 다른 작업들이 다른 묶음으로 분류될 수 있을 때 사용되는 알고리즘이다.
● 일괄 처리 작업이 실행 중일지라도 상위 단계 큐에 작업이 들어오면 일괄 처리 작업은 선점 당한다.
● 한 큐에서 다른 큐로의 작업 이동은 불가능 하다.



□ MFQ 스케줄링

새로운 프로세스가 들어오면 높은 우선순위를 할당해 주어 단계1에서 즉시 수행해 주고 점차 낮은 우선순위를 부여하며 단계 n쯤 되는 나중에는 그 작업이 완료될 때까지 라운드 로빈으로 순환된다. 하나의 준비 큐를 통해 여러 피드백 큐를 걸치며 작업을 수행하는 방법이다. 이 방법은 CPU에 대한 요구량에 따라 프로세스들을 분류하는대 이상적인 방법이다.
● 짧은 작업에 유리하다.
● 입출력 장치를 효과적으로 이용하려고 입출력 위주의 작업들에 우선권을 준다.
● 가능한 빨리 작업의 특성을 알고 그것에 맞게 해당 작업을 스케줄링 한다.

● 프로세스가 보다 하위 단계의 큐로 옮겨갈수록 주어진 할당 시간은 점차 크게 설정된다.
 

■ 비선점 스케줄링

비선점은 한 프로세스가 CPU를 할당받으면 다른 프로세스는 할당 받은 프로세스가 작업을 종료할때 까지 CPU를 사용 불가능 한 방식이다. 모든 프로세스의 요구를 공정히 처리할 수 있다. 응답시간이 예측 가능하다. 단 짧은 작업이 긴 작업을 기다리는 경우가 발생 할 수 있다.

□ 우선순위 스케줄링

각 프로세스에게 우선순위를 부여하여 순위가 높은 순서대로 처리하는 방법이다. 우선순위는 보통 프로세스의 특성과 종류에 따라서 각각 다르게 부여될 수 있다. 우선순위 스케줄링은 정적 우선 방법과 동적 우선 방법이 있다.

정적 우선순위 방법 : 실행이 쉽고 상대적으로 오버 헤드는 적지만 주위 여건의 변화에 적응하지 못하고 우선순위를 바꾸지 않는다.

동적 우선순위 방법 : 상항 변화에 잘 적응한다. 구현하기가 복잡하고 오버헤드가 많으나 시스템이 응답도를 증가시켜 주므로 효율성이 있다.

□ 기한부 스케줄링


기한부 스케줄링은 작업들이 명시된 시간이나 기한 내에 완료되게 계획되고 작업들의 결과가 시간내에 구해지면 유용하고 마감 시간이 지난 후에 결과가 구해지면 쓸모가 없게 된다.

● 사용자는 사전에 작업이 요구하는 정확한 자원을 제시해야만 한다. 만약 기한 시간 내에 일을 끝내지 못하면 막대한 손해를 초래한다.
● 시스템은 다른 사용자들에 대한 서비스를 감소시키지 않으면서 기한부 작업을 실행할 수 있어야 한다.
● 시스템은 기한까지 일을 끝내기위해 자원 안배를 주의 깊게 계획해야 한다.
● 만약 많은 기한부 작업들이 동시에 실행된다면 스케줄링이 너무 복잡하게 된다.
● 기한부 스케줄링으로 요구되는 집중적인 자원 운영은 많은 오버헤드가 뒤따른다.

□ FCFS(FIFO) 스케줄링

가장 단순한 방식으로 프로세스들이 대기 큐에 도착한 순서에 따라 CPU를 할당 받는 방식이다. 
이방식은 일단 프로세스가 CPU를 차지하면 완료될 때까지 수행한다. 다른 방식에 비하여 작업 완료 시간을 예측하기가 쉽다. 선점이 불가능하기때문에 수행시간이 긴 프로세스가 할당받은 상태라면 수행시간이 짧은 프로그램이 대기할 경우가 생기고 중요한 작업이 대기하는 상황이 발생할수 있다. 또한 대화식 사용자들에게는 부적합하다.

□ SJF 스케줄링
SJF 방식 (SJN)은 준비큐에서 기다리는 작업중 수행시간이 가장 짧다고 판단되는 것을 가장 먼저 수행하는 스케줄링 방법이다. FCFS 보다 평균 대기 시간을 감소시키지만 큰 작업일수록 FCFS에 비해 예측이 어렵다. 긴 작업보다 짧은 작업일 수록 오버헤드 면에서 볼 때 유리하다. 하지만 이 방법은 수행할 작업이 얼마나 긴 것인지를 정확히 판단 해서 수행해야 하는대 수행시간을 정확히 얻는다는 것이 어렵다. 

□ HRN 스케줄링

이 방법은 SJF의 약점 특히 긴 작업과 짧은 작업 간의 불평등을 어느 정도 보안한 방법이다. 
이 방법도 비선점 스케줄링 방식이므로 한 작업이 CPU를 차지하면 그 작업은 완성될 때까지 실행한다. 
우선순위는  (대기 시간 + 버스트 시간) / 버스트 시간 으로 정한다. 

각각 스케줄링 방법을 표로 정리해보면 다음과 같다. 

2차방정식의 근구하기 알고리즘


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

void main()
{
double a,b,c,x,ans,ans2,d,e;//x=판별식   ans,ans2=답 




printf("ax^2+bx+c 인 이차방정식의 a,b,c를 입력하시오");
scanf("%lf %lf %lf",&a,&b,&c);


x=b*b-4*a*c;  //판별식구하기

if(x==0)  //중근인 이차방정식
{
ans=-b/2*a;
printf("x=%d",(int)ans);
}
if(x>0)
{
d=-b+sqrt(x);
e=-b-sqrt(x);
ans=d/(2*a);
ans2=e/(2*a);
printf("x1=%d  x2=%d",(int)ans,(int)ans2);   

}
system("pause");

}

2013년 3월 22일 금요일

마방진 알고리즘


마방진(magic square)이란 가로,세로, 대각선의 합이 같은 사각형을 말한다.




구현 방법은

시작은 첫행 , 중간열 에서 1 을 두고
행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.
예외처리 두 가지


입출력 예

입력

9

출력

  8  1  6
  3  5  7
  4  9  2
---------------------------------------------------------

#include<stdio.h>
#include<math.h>
void main()
{
int sq[100][100]={0}; //마방진칸
int i,j; //for문 변수
int a,b=1,num2; // num2=마방진 칸을 제곱근으로 바꿔 배열설정
int x=0,y=0;
double num; //num= 마방진 칸수


do //마방진 입력이 잘못되었으면 재입력
{
printf("마방진의 칸수(홀수의 제곱수_최대 100)를 입력하세요: ");
scanf("%lf", &num);


while((int)num%2==0 || num>100);

num2=sqrt(num); //num 제곱근으로 변경
a=num2/2;
sq[0][a]=b;
x=num2/2;
for(i=0;i<num-1;i++)
{
b+=1;
int yy=y-1;
int xx=x+1;



if(yy<0)     //위로 올라갈곳이없을시 가장아래로 이동

yy=num2-1;    

if(xx>num2-1)  //오른쪽으로 이동이불가능할시 맨왼쪽으로 이동

xx=0;

if(sq[yy][xx]!=0) //이동하려는곳에 숫자가 이미있을경우 아래로 이동
{
y+=1;
if(y>=num2)
y=0;
}
else
{
x=xx;
y=yy;
}
sq[y][x]=b;
}
for(i=0;i<num2;i++)
{
for(j=0;j<num2;j++)
{
printf("%3d",sq[i][j]);

}
printf("\n");
}

}


2013년 3월 21일 목요일

mang0: 선린 Layer7 13기 홈페이지

mang0: 선린 Layer7 13기 홈페이지: aboutapple.or.kr 선린 Layer7 13기 홈페이지

달팽이배열 알고리즘

달팽이배열



입력

3 

출력

    1    2    3
    8    9    4
    7    6    5

------------------------------------------
#include<stdio.h>
 void main()
 {
  int sna[100][100]={0};
  int x=0,y=-1,a=1,num=1,b,i,j,count=0;
  
  do
  {
   printf("크기를 입력하세요: ");
   scanf("%d", &b);
  } 
  while(b<=0 || b>100); //입력받은 b값이 0보다작거나 100보다크면 b를 재입력받는다  
  count = b;
  
  while(count!=0)
  {
   for(i=0;i<count;i++) 
   {
    y+=a;
    sna[x][y]=num++;
   }
  
   count--;
   for(i=0;i<count;i++) 
   {
    x+=a;
    sna[x][y]=num++;
   }
   a*=-1;
  }
  
  for(i=0;i<b;i++) 
  {
   for(j=0;j<b;j++) 
   {
    printf("%3d",sna[i][j]);
   }
   printf("\n");
  }
  
 }
  
 

2013년 3월 20일 수요일

*로 이등변삼각형 그리기 알고리즘

*로 이등변삼각형 그리기


입력



3


출력


  *

 ***
*****


--------------------------------------------------

#include<stdio.h>
void main()
{
 int hi; //삼각형 층수 

 int i,j,k
 printf("삼각형 층수는?");
 scanf("%d",&hi);
 for(i=0;i<hi;i++)
 {
  for(j=hi;j>=i;j--)
  {
   printf(" ");
  }
  for(k=0;k<2*i-1;k++)
  {
   printf("*");
  }
 printf("\n");
 }
}

파스칼삼각형 알고리즘


파스칼삼각형



프로그램 명: pascal_tri

   1
  1 1
 1 2 1
1 3 3 1
다음과 같이 바로 위의 두 숫자를 더한 합이 자신의 숫자가 되는 삼각형을 파스칼 삼각형이라고 한다.

입력

이 파스칼 삼각형의 층수가 주어진다.

출력

층수 까지의 파스칼 삼각형을 출력하여라.

입출력 예

입력

4

출력

   1
  1 1
 1 2 1
1 3 3 1

--------------------------------------------------------------------


#include<stdio.h>
void main()
{

int hi;//삼각형 높이
int tr[100][100]={0};
int i,j,k;

printf("파스칼삼각형의 높이를 입력하시오");
scanf("%d",&hi);

for(i=0;i<hi;i++)
{

for(j=0;j<i;j++)
{
tr[i][j]=0;
}
}
tr[1][1]=1;
for(i=2;i<=hi;i++)
{
for(j=1;j<=i+1;j++)
{
tr[i][j]=tr[i-1][j]+tr[i-1][j-1];//윗줄 왼쪽오른쪽 항의 계산
}
}
for(i=1;i<=hi;i++)
{

{
for(k=1;k<=hi-i;k++)//삼각형 여백
printf(" ");
}
for(j=1;j<=i;j++)
{
printf("%3d",tr[i][j]);//삼각형 출력
}
printf("\n");
}

}