Search

의사코드 작성법

대분류
기타
소분류
알쓸신잡
유형
의사코드
부유형
클린코드
작성법
작성 규칙
주요 레퍼런스
https://velog.io/@yungiy/%EC%9D%98%EC%82%AC-%EC%BD%94%EB%93%9Cpseudo-code-%EC%9E%91%EC%84%B1%EB%B2%95
https://ittrue.tistory.com/98
https://ocblog.tistory.com/84
https://sujinlee.me/pseudocode/
최종 편집 일시
2024/11/01 02:13
생성 일시
2024/07/15 06:21
13 more properties

의사코드(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
복사

일단 뭘 할지 모르겠으면 VSCode부터 키고 시작해보자.