메뉴 건너뛰기

문제집 / 그룹 문제

문제집 만든이 문제수 조회수 좋아요 생성 수정 공개
문제 해결과 C 프로그래밍 : 01. 기본 개념 관리자 0 4927 3 2018-12-17
03:20:00
2018-12-25
05:07:59
2018-12-17
03:23:20


01. 기본 개념

문제의 인식

지금 해결해야할 어떤 문제에 직면해 있다고 가정하자. 여기서 ‘문제’는 현재 학교에서 배우고 있는 교과와 관련된 문제일 수도 있고, 일상생활에서 발생하는 소소한 문제일 수도 있다. 이때, 컴퓨터를 이용하여 그 문제를 해결하기 위해서는 먼저 문제에 대한 인식이 선행되어야 한다. 문제를 인식한다는 것은 그 문제의 성격을 파악하는 것이다. 

만약, 해결하고자 하는 문제가 암산으로 계산할 수 있거나, 종이와 연필을 사용해서 간단하게 해결 가능하다면 우리는 굳이 컴퓨터를 이용할 필요가 없다. 컴퓨터를 이용해야 하는 경우는 대부분 처리해야할 데이터가 많거나, 동일한 계산이나 작업이 반복되는 경우, 또는, 상당히 복잡해서 다른 방법으로는 처리할 수 없는 경우 등 일 것이다. n개의 수로 이루어진 무작위 수열을 오름차순으로 정렬한다고 가정하자. 여기서 n이라는 숫자가 10 미만이라면, 암산 또는 종이와  연필만으로도 문제를 충분히 해결할 수 있다. 그러나, n이 상당히 크다고 가정하면, 즉, n이 100이라면, 암산이나 직접 써내려가며 계산하는 방식으로는 해결하기 힘들다. 1000개, 10000개라면 거의 불가능에 가깝다. 

또한 전교생의 과목별 성적 합계와 평균을 계산한다고 가정하자. 4~5명의 성적은 간단히 계산할 수 있지만, 100명 이상의 성적을 암산이나 손으로 계산하는 경우는 매우 드물다. 가능하더라도 계산 결과의 신뢰성은 많이 떨어질 것이다. 이러한 문제들은 컴퓨터를 이용하는 것이 해결하기도 쉬울 뿐더러 정확성과 더불어 결과의 신뢰성도 높아진다. 

컴퓨터로 문제를 해결할 때는 그 문제의 특정 사례, 즉, 정렬 문제에서 수열을 구성하는 원소의 개수가 10개, 또는, 100개인 경우만을 풀기 위한 특수한 프로그램을 만드는 것이 아니라, 보편적인 사례를 해결할 수 있는 보편적인 범용 프로그램을 만들어야 그 프로그램의 유용성이 높아진다. 10개, 100개, 157개, 1020개, 15022개... 등 다양한 개수의 원소로 이루어진 수열을 정렬할 수 있는 프로그램을 개발해야 한다는 것이다.

문제의 정의

문제를 해결하기 위해 컴퓨터를 이용하기로 결정하였다면, 그 문제를 컴퓨터로 처리할 수 있도록 다시 정의해야 한다. 문제를 다시 정의하는 일반적인 방법은 입력과 출력으로 분리하여 기술하는 것이다. "n개의 수로 이루어진 무작위 수열을 오름차순으로 정렬"하고자 하는 문제는 다음과 같은 입력과 출력으로 다시 정의할 수 있다.

■ 입력 : n과 n개의 수로 이루어진 무작위 수열
■ 출력 : 오름차순으로 정렬된 수열

이때, 가능한 명확히 기술해야 한다. 왜냐하면, 이렇게 분리하여 정의된 입력과 출력이 곧 해결해야할 문제이기 때문이다.

문제의 해결

알고리즘

이제 남은 것은 입력을 받아서 원하는 출력을 만들어 내는 처리 과정(Process)이다. 이러한 처리 과정을 "알고리즘(Algorithm)"이라고 한다. 여기서, 알고리즘이란 "컴퓨터가 어떤 작업을 수행하기 위해 거쳐야만 하는 잘 정의된 논리적 단계들의 집합"이다. 즉, 입력 데이터를 받아서 컴퓨터로 하여금 일련의 논리적 단계들을 거치게 함으로써 원하는 출력을 만들어 낸다면, 그것이 바로 "컴퓨터를 이용하여 문제를 해결"한 것이다. 

[보충 설명 : 입력과 출력, 그리고 알고리즘]
알고리즘의 정의 방법에 따라서는 입력과 출력이 알고리즘의 첫 번째 단계와 마지막 단계로 포함되기도 한다. 그러나, 컴퓨터를 이용하여 효율적으로 문제를 해결하고자 할 때, 우리의 주요 관심 사항은 입‧출력 자체보다는 입력으로부터 출력을 만들어내는 '과정', 또는, '처리'에 있음을 잊지 말자.

알고리즘의 설계

어떤 문제를 컴퓨터로 해결할 수 있도록 "입력"과 "출력"으로 분리하여 기술하였다면, 입력 받은 데이터를 원하는 결과로 만들어내는 과정인 "알고리즘"을 설계해야 한다. 알고리즘을 설계한다는 것은 알고리즘을 구성하는 각 단계를 규명하는 것이다.

알고리즘의 설계 도구

필요한 단계들을 규명하기 위해서는 우선 알고리즘을 구성하는 세부 단계들을 어떤 방법으로든 구체적으로 표현할 수 있어야 한다는 것이다. 도형이나 그림으로 표현할 수도 있고, 자연어 등으로 기술할 수도 있다. 

다음은 종이 비행기를 만들기 위한 단계들을 그림으로 표현한 것이다. 이것이 바로 “종이 비행기를 만드는” 알고리즘이다. 그러나 컴퓨터 알고리즘은 일반적으로 위와 같은 도형이나 도식이 아닌 코드로 표현한다. 이러한 코드를 “의사코드(Pseudocode)"라고 한다.

의사(疑似) 코드란 특정 프로그래밍 언어로 기술된 ‘진짜’ 코드가 아닌, 알고리즘의 각 단계와 전체적인 흐름을 쉽게 파악할 수 있도록 자연어 등으로 기술한 ‘가짜’ 코드다. 즉, 실제 프로그래밍 언어로 코딩된 프로그램은 기계어로 번역되어 컴퓨터에서 실행 될 수 있지만, 의사 코드로 기술된 프로그램은 번역되거나 실행될 수 없는, 진짜 코드를 흉내 낸 코드라는 의미를 내포하고 있다. 이러한 가짜 코드를 사용하는 이유는 알고리즘의 전체적인 흐름과 윤곽을 쉽게 파악하기 위해서다. 실제 프로그래밍 언어로 알고리즘을 기술하면, 해당 언어의 세세한 문법 구조 등이 알고리즘의 전체 흐름을 파악하는데 오히려 방해가 될 수 있기 때문이다.

의사 코드를 기술하는 특정 규칙이나 문법이 없기 때문에, 알고리즘을 기술하는 당사자가 편리한 방법을 선택하여 기술하면 된다. 영어나 한국어 등의 자연어로 기술할 수도 있으며, 특정 프로그래밍 언어와 유사한 구조로 기술하기도 한다. 알고리즘을 파악한 후에 프로그래밍 언어를 이용하여 알고리즘을 구현하는 경우가 일반적인 과정이므로, 사용 빈도가 높은 프로그래밍 언어, 특히 C, C++, 또는 Java 스타일의 의사코드를 사용하기도 한다.



코드 제목 시간(초) 메모리(MB) 나의판정 소스 제출 통과 비율(%) 시도 성공 비율(%)

위로