기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

스크래치 프로그래밍 맛보기 : 스크래치로 작성한 정보올림피아드 문제 풀이

기술자료
DBMS별 분류
Etc
작성자
dataonair
작성일
2015-04-20 00:00
조회
4630



스크래치 프로그래밍 맛보기

스크래치로 작성한 정보올림피아드 문제 풀이



스크래치는 MIT 대학교에서 2007년에 만든 교육용 프로그래밍 언어다. 다른 프로그래밍 언어와 달리 마치 레고 블록을 쌓듯 프로그램을 만들 수 있어 배우기 쉽다. 스크래치 홈페이지(scratch.mit.edu)에서 직접 프로그램을 만들 수 있고, 오프라인 버전을 다운로드 받아 사용할 수도 있다.



초등학교 때부터 스크래치로 프로그램을 만들다가 약 2년쯤 전 부터 C 언어를 시작했다. 정보 올림피아드 문제를 가지고 스크래 치로 먼저 프로그램을 만들어 본 다음, 그것을 C 언어로 변환해보 는 방식으로 공부했다. 그때 처음으로 풀었던 문제가 2004년 정보 올림피아드 문제인 ‘백설공주와 난쟁이’다. 먼저 문제를 소개한 다 음에 스크래치로 프로그램을 만들어보고, 이어서 C언어로도 만들 어보겠다.



백설공주와 난쟁이안개 숲에는 백설 공주와 7명의 난쟁이가 함께 살고 있다. 7명의 난쟁이의 키가 입
력으로 주어질 때 이 중 키가 가장 큰 난쟁이와 두 번째로 큰 난쟁이의 키를 출력하
는 프로그램을 작성하시오.입력형식 : 첫 째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 난쟁이의 키가 주어진
다. 주어지는 난쟁이의 키는 100보다 작은 자연수이다.출력형식 : 첫째 줄에는 가장 키가 큰 난쟁이의 키를 출력한다. 두 번째로 키가 큰
난쟁이의 키를 출력한다. 만약 가장 키가 큰 난쟁이가 둘 이상이라면 첫째 줄과 둘
째 줄에 같은 값을 출력해야 한다.(출처: 2004년 정보 올림피아드 지역본선 초등부 1번)



입력데이터 저장하기

스크래치에는 파일에서 데이터를 읽어오는 기능이 없다. 그래서 입력 데이터를 코드에 직접 넣어줘야 한다. 문제에서 7명의 난쟁이 가 입력데이터로 주어 지므로 이것을 ‘input’ 이라는 리스트를 만들 어 저장한다.



문제해결 알고리즘

가장 큰 키는 일곱 개의 입력데이터 중에서 최대값을 구하면 얻 을 수 있다. 두 번째로 큰 키는 앞에서 얻은 최대값을 제외한 나머 지 여섯 개의 데이터 중에서 다시 최대값을 구하는 방식으로 “백설 공주와 난쟁이” 문제를 해결할 수 있다.

최대값을 구하기 위해서 ‘i’ ‘mx’ ‘mi’ 세 개의 변수를 만들었다. 난쟁이가 7명 있으므로 i를 1부터 7까지 반복하면서 현재까지의 최대값과 비교한다. 만약 현재까지의 최대값보다 더 큰 키가 나왔 다면 최대값을 바꾸고 그때의 난쟁이 번호를 mi에 저장한다

이를 7회 반복했다면 난쟁이 중 가장 큰 키가 mx에 저장돼 있 고, mi에는 가장 큰 난쟁이의 번호가 저장돼 있다. 여기서 mx를 이용해 백설공주가 가장 큰 키의 값을 말할 수 있다.

지금까지 난쟁이 중 가장 큰 사람 키의 값을 구했다. 두 번째로 큰 키도 같은 방법으로 구할 수 있다. 하나 주의할 점은 여기서 바 로 최대값을 구할 경우 전의 값과 같은 값이 나온다는 것이다. 그 래서 mi번째 난쟁이 키의 값을 0으로 바꾼 후 최대값을 구해야 한 다. 이렇게 하면 가장 큰 이를 제외한 나머지 난쟁이 중 가장 큰 키, 즉 두 번째로 큰 키의 값을 구할 수 있다.



C++언어로 구현하기

C++언어로 위 문제를 구현해보겠다. 이번에도 i, mx, mi 변수가 필요하다. 스크래치에서 최대값을 구할 때 7번 반복하기 블록을 사용했는데, C++언어에서는 ‘for’를 사용하면 된다. ‘for’는 세 부분으로 나누어서 작성하면 된다. 첫 번 째 부분에는 변수의 초기값, 두 번째 부분에는 반복이 끝나는 조 건, 세 번째 부분에는 반복할 때 마다 변하는 값에 대해서 써주면 된다. 지금 같은 경우에는 i를 0으로 초기화 시키고 i가 7보다 작을 때까지 반복하면서 i를 1씩 증가하도록 만들면 된다.

스크래치 프로그램에 ‘만약’이라는 블록도 나오는데, C++언어 는 ‘if’라는 명령어를 쓰면 된다. ‘if’ 안에 조건을 써주면 그 조건이 맞을 경우에 중괄호 안에 있는 일을 실행하게 된다.

마지막으로 읽는 방법과 출력하는 방법에 대해 알아보겠다. 읽 을 때는 ‘scanf’나 ‘cin’ 같은 명령어를 쓸 수 있다. ‘scanf’는 첫 번째 부분과 두 번째 부분으로 나뉘는데 첫 번째 부분에는 어떤 형태로 읽을지, 두 번째 부분에는 읽은 데이터를 어디에 저장할지 써주면 된다.

출력은 ‘printf’나 ‘cout’를 쓰면 된다. ‘printf’는 ‘scanf’와 비슷하 게 출력하는 형태와 출력하는 변수를 나눠서 써주면 된다.


#include namespace std;mx, mi,
a[10];main()b
int i;
freopen ("input.txt", "r", stdin);
for (i = 0; i < 7; i++) {
scanf ("%d", &a[i]);
if (a[i] > mx) {
mx = a[i];
mi = i;
}
}
printf ("%d\n", mx);
a[mi] = 0;
mx = 0;
for (i = 0; i < 7; i++) {
if (a[i] > mx) {
mx = a[i];
mi = i;
}
}
printf ("%d\n", mx);
return 0;d


#include namespace std;
a[10];main()b
int i;
freopen ("input.txt", "r", stdin);
for (i = 0; i < 7; i++) {
cin >> a[i];
}
sort(a, a + 7);
cout < < a[6] < < endl;
cout < < a[5] < < endl;
return 0;d



조금 더 간단하게 만드는 방법도 있다. C++언어에는 ‘sort’라는 함수가 포함돼 있다. 이 함수를 사용하면 보다 간단하게 문제를 해 결할 수 있다. ‘sort’ 함수는 데이터를 작은 것부터 큰 순서로 정렬 하는 함수다. 이 함수를 사용해 맨 뒤에 있는 값과 뒤에서 두 번째 값을 출력하면 된다. 이 함수를 사용할 때는 “#include < algori thm>”을 추가로 넣어줘야 한다



출처 : 마이크로소프트웨어 3월호

제공 : 데이터전문가 지식포털 DBguide.net