의사코드(Pseudo Code)란?
•
프로그래밍을 하기 전. 무엇을 어떻게 동작하도록 할 건지에 대해 사람이 이해할 수 있는 언어로 작성하는 것
•
프로그램의 진행 과정을 단계별로 기록해 놓은 것
•
의사(Pseudo:가짜) 코드 : 알고리즘 수행 내용을 컴퓨터가 아닌 사람이 이해하도록 작성된 것
왜 의사코드를 작성해야 하는가?
•
일단 우리는 컴퓨터도 아니고 천재도 아닐 뿐더러 한국 사람이므로 사람의 생각을 영어로 작성되는 프로그램 코드로 변환하여 작성하는 것은 쉽지 않다.
•
본 문제는 특히나 비기너 개발자들이 코딩에 입문하는 데에 어려움으로 나타나고 당면한 문제를 해결하려고 생각을 바로 코드로 변환하려고 하니 어려울 수 밖에 없다.
•
이러한 문제를 해결하기 위해 의사코드를 작성하는 거라고 필자는 생각한다.
•
또한 이는 비기너 뿐 아니라 이후 팀 협업을 할때에도 유용하게 사용되며 경제적으로 유용하게 작용된다.
1.
비용 면에서 의사코드 설계에서 미리 오류를 수정하는 것이 이후 과정에서 수정하는 것보다 더욱 경제적이다.
2.
코드 검토(Code Review)가 더 쉬워진다.
3.
디버깅 및 코드 수정을 할 때 용이하다.
4.
알고리즘의 실행 과정을 미리 볼 수 있다.
5.
코드의 완성도가 높아진다.
•
의사코드 작성 비교 그래프
좋은 의사코드 작성 규칙
•
모두 똑같은 스타일로 일관성있게 작성한다.
◦
똑같은 연산 기호를 사용하고, 적절한 곳에, 이해하기 쉬운 문장으로 짧게 작성한다.
1.
입력, 치환, 산술, 관계, 논리, 출력의 최소 기본 기능 단위로 한번에 한가지만 기술한다.
•
이후 개발 고수와 초보의 차이는 코드의 재사용성과 모듈의 독립성을 얼마나 잘 구현했는가이다.
•
좋은 모듈은 결합도가 낮고 응집도가 높은 모듈이다.
결합도 : 모듈 내부가 아닌 외부의 모듈과의 연관도 또는 모듈 간의 상호의존성을 나타내는 정도
응집도 : 모듈 내부 구성요소 간 연관 정도, 하나의 모듈은 하나의 기능을 수행
2.
클린 코드 작성 원칙을 준수하여 작성한다.
→ 결국 의사코드는 클린 코드를 작성하기 위한 단계이므로 이후 클린 코드가 되기 위한 준비를 하는 것이다.
•
가독성 : 명확하고 이해하기 쉬운 코드
ex) 의미 있는 변수와 함수, 일관된 코드 스타일, 코드의 의도 명확히 전달
•
단순성 : 작은 함수 사용, 간결한 로직, 코드 중복 제거, 코드 내 중복된 로직이 많을 수록 에러 가능성은 높아지고 유지보수가 어려워진다.
•
의존성 배제 : 모듈이나 클래스 간의 의존성을 최소화하여 코드의 유연성을 향상시킨다.
•
중복성 최소화 : 함수 추출 : 반복되는 코드는 함수로 추출하여 재사용, 상수 사용: 반복되는 값은 상수로 정의
•
추상화 : 세부 구현을 숨기고, 필요한 기능만 노출하여 코드의 복잡성을 감소시킨다.
ex) 클래스와 객체 사용, 인터페이스 정의
의사코드 작성법
1.
구체적인 방법보다 무슨 일을 할 것인지?를 기술
2.
목적어 + 동사 형식으로 기술
3.
처리단계 레벨은 되도록 3단계까지만 표현 (들여쓰기(인텐트) 3단계)
초기에는 한국어로 일단 좌라락 써보고
그게 익숙해졌다면 자연어와 프로그래밍 언어의 조합을 사용한다.
의사코드 작성 순서
1.
작성 전 문제를 이해
2.
문제 전체에 대한 처리를 순차적으로 표현
a.
변수, 상수가 무엇이 필요한지
b.
어떤 기능을 하는 함수가 필요한지
또는 큰 틀을 먼저 잡아놓은 후 세분화하기
c.
함수 내부 로직 작성하기
3.
순차적인 표현에서 선택(분기)이나 반복이 필요한 부분에 추가
a.
반복문
•
무엇을 반복해야하는가?
•
반복을 끝내기 위한 break문, continue문 등이 필요한가?
b.
조건문
•
어떤 조건이 필요한가?
◦
참이면?
◦
거짓이면?
•
또 다른 조건이 있나?
◦
참이면?
◦
거짓이면?
•
조건은 중첩이 안될 수록 좋은 코드.
조건이 중첩될 때의 안좋은 예
c.
예외처리문
•
어떤 에러/실패에 대한 예외처리를 해야하는가?
◦
에러가 안뜬다면?
◦
에러가 뜬다면?
작성 과정
예제1
주어진 정수 배열에서 최대값과 최소값을 찾아 출력하시오.
1.
문제 이해
•
정수 배열이 주어짐
•
배열에서 최대값과 최소값을 찾아야 함
•
최대값과 최소값을 출력
2.
문제 전체에 대한 처리를 순차적으로 표현
a.
변수, 상수 찾기
•
입력 배열: inputArray
•
최대값: maxValue
•
최소값: minValue
b.
어떤 기능을 하는 함수가 필요한지
•
최대값과 최소값을 찾는 함수: findMaxMin()
c.
함수 내부 로직 작성하기
•
findMaxMin() 함수 내부에서 반복문을 사용하여 최대값과 최소값을 찾음
or max(), min()함수를 사용하여 최대값 최소값 구하기
or 배열을 정렬(sort)하여 처음 인덱스와 끝 인덱스를 추출하기
3.
순차적인 표현에서 선택(분기)이나 반복이 필요한 부분에 추가
•
반복문: 배열의 각 요소를 확인하여 최대값과 최소값을 갱신
# 필요한 변수 : 입력 배열, 최대값, 최소값
# 필요한 함수 : 최대 최소 찾는 함수
# 로직 : 반복문을 사용하여 최대값과 최솟값 찾기
# 배열 입력받기
# 최대값과 최소값을 찾는 함수 (반복문 사용)
# 초기 최대값과 최소값 설정
# 배열의 각 요소를 확인하여 최대값과 최소값 갱신
# 최대값과 최소값 반환
# 최대값과 최소값을 찾고 출력
Python
복사
# 배열 입력받기
inputArray = [정수 배열 입력]
=> inputArray = list(map(input("숫자를 입력해주세요. (공백으로 구분) :").split()))
# 최대값과 최소값을 찾는 함수 (반복문 사용)
function findMaxMin(array):
# 초기 최대값과 최소값 설정
maxValue = array[0]
minValue = array[0]
# 배열의 각 요소를 확인하여 최대값과 최소값 갱신
for element in array:
if element > maxValue:
maxValue = element
if element < minValue:
minValue = element
# 최대값과 최소값 반환
return maxValue, minValue
# 최대값과 최소값을 찾고 출력
maxValue, minValue = findMaxMin(inputArray)
print("최대값:", maxValue)
print("최소값:", minValue)
Python
복사
예제2
주어진 문자열에서 각 단어의 빈도를 계산하고, 가장 빈도가 높은 단어를 출력하시오.
1.
문제 이해
•
문자열이 주어짐
•
문자열에서 각 단어의 빈도를 계산해야 함
•
가장 빈도가 높은 단어를 찾아 출력
2.
문제 전체에 대한 처리를 순차적으로 표현
a.
변수, 상수 찾기
•
입력 문자열: inputString
•
단어 빈도를 저장할 딕셔너리: wordFrequency
•
가장 빈도가 높은 단어: mostFrequentWord
•
가장 높은 빈도수: highestFrequency
b.
어떤 기능을 하는 함수가 필요한지
•
문자열을 단어로 분리하는 함수: splitWords()
•
단어 빈도를 계산하는 함수: countWordFrequency()
•
가장 빈도가 높은 단어를 찾는 함수: findMostFrequentWord()
큰 틀을 먼저 잡아놓은 후 세분화하기
i.
문자열을 입력받음
ii.
문자열을 단어로 분리
iii.
각 단어의 빈도 계산
iv.
가장 빈도가 높은 단어 찾기
v.
결과 출력
c.
함수 내부 로직 작성하기
•
splitWords(): 문자열을 단어로 분리하여 리스트로 반환
•
countWordFrequency(): 단어 리스트를 받아 단어 빈도를 계산하여 딕셔너리로 반환
•
findMostFrequentWord(): 단어 빈도 딕셔너리를 받아 가장 빈도가 높은 단어를 반환
3.
순차적인 표현에서 선택(분기)이나 반복이 필요한 부분에 추가
•
반복문: 단어 리스트에서 각 단어의 빈도를 계산할 때 사용
•
조건문: 가장 높은 빈도를 찾기 위해 비교할 때 사용
# 필요한 변수 : 입력 문자열, 단어 빈도를 저장할 딕셔너리, 가장 빈도가 높은 단어, 가장 높은 빈도수
# 필요한 함수 : 문자열을 단어로 분리하는 함수, 단어 빈도를 계산하는 함수, 가장 빈도가 높은 단어를 찾는 함수
# 로직
# 반복문: 단어 리스트에서 각 단어의 빈도를 계산할 때 사용
# 조건문: 가장 높은 빈도를 찾기 위해 비교할 때 사용
# 1. 문자열을 입력받음
# 2. 문자열을 단어로 분리하는 함수 정의
# 공백을 기준으로 문자열을 단어로 분
# 3. 단어 빈도를 계산하는 함수 정의
# 빈 딕셔너리 생성
# 각 단어의 빈도를 계산
# 4. 가장 빈도가 높은 단어를 찾는 함수 정의
# 초기 값 설정
# 단어 빈도 딕셔너리에서 가장 높은 빈도 찾기
# 5. 순차적으로 함수 호출 및 결과 출력
# 문자열을 단어로 분리
# 단어 빈도 계산
# 가장 빈도가 높은 단어 찾기
# 결과 출력
Python
복사
# 1. 문자열을 입력받음
inputString = input("문자열을 입력해주세요")
# 2. 문자열을 단어로 분리하는 함수 정의
function splitWords(string):
# 공백을 기준으로 문자열을 단어로 분리
words = string.split()
return words
# 3. 단어 빈도를 계산하는 함수 정의
function countWordFrequency(words):
# 빈 딕셔너리 생성
wordFrequency = {}
# 각 단어의 빈도를 계산
for word in words:
if word in wordFrequency:
wordFrequency[word] += 1
else:
wordFrequency[word] = 1
return wordFrequency
# 4. 가장 빈도가 높은 단어를 찾는 함수 정의
function findMostFrequentWord(wordFrequency):
# 초기 값 설정
mostFrequentWord = None
highestFrequency = 0
# 단어 빈도 딕셔너리에서 가장 높은 빈도 찾기
for word, frequency in wordFrequency.items():
if frequency > highestFrequency:
highestFrequency = frequency
mostFrequentWord = word
return mostFrequentWord, highestFrequency
# 5. 순차적으로 함수 호출 및 결과 출력
# 문자열을 단어로 분리
words = splitWords(inputString)
# 단어 빈도 계산
wordFrequency = countWordFrequency(words)
# 가장 빈도가 높은 단어 찾기
mostFrequentWord, highestFrequency = findMostFrequentWord(wordFrequency)
# 결과 출력
print("가장 빈도가 높은 단어:", mostFrequentWord)
print("빈도수:", highestFrequency)
Python
복사