대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 스크래치 프로그래밍 맛보기 : 스크래치로 작성한 정보올림피아드 문제 풀이
등록일 조회수 5000
첨부파일  

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

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



스크래치는 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 ", mx); a[mi] = 0; mx = 0; for (i = 0; i < 7; i++) { if (a[i] > mx) { mx = a[i]; mi = i; } } printf ("%d ", 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