알고리즘 - 수도코드 작성법
알고리즘을 짜기 위해서는
수도코드를 잘 작성할 줄 알아야 합니다.
이는,
현실 세계의 문제를 추상화하여
각각의 함수가 잘 작동할 수 있게
간결하게 작성하는 연습입니다.
이를 위해서,
세가지,
- 요구사항이 하나 이상인 문제를 여러개로 쪼개서 생각할 수 있는가.
- 문제를 일상적인 문장으로 표현할 수 있는가.
- 잘게 쪼갠 특정 문제가 Javascript의 어떤 개념과 연관되는가.
그리고, 갖추어야할 능력 5가지.
- 작성한 수도코드를 자바스크립트로 능숙하게 바꿀 수 있다.
- 타입 확인과 변환을 능숙하게 할 수 있다.
- 이중 반복문을 능숙하게 사용할 수 있다.
- 반복문 내에 여러개의 if문을 능숙하게 사용할 수 있다.
- for문과 while문이 필요한 때를 쉽게 파악할 수 있다.
알고리즘 문제 풀기 프로세스
텍스트에서 foo라는 단어를 찾아 전부 다른 단어로 바꿔주는 코드를 작성한다고 가정해봅시다.
1. pseudocode
- 텍스트를 입력으로 받는다
- foo라는 단어를 찾는다
- 그 단어를 지운다
- 그 자리에 새로운 단어를 넣는다
- 바뀐 내용을 리턴한다
2. pseudocode의 구체화
-
텍스트를 입력으로 받는다
-
foo라는 단어를 찾는다
-
끝까지 일치하는지 확인해 본 후,
-
foo라는 글자의 index가 -1이 아니면 단어를 찾은 것이다
-
-
while index를 발견하면
-
index를 이용해 foo 바로 앞까지의 텍스트를 얻어내고
-
foo 대신 새로운 단어를 넣는다
-
foo 이후의 텍스트를 넣는다
-
-
endwhile
-
3. 이것을 코드로 옮겨보면,
function replaceFoo(text) {
// foo라는 글자의 index가 -1이 아니면 단어를 찾은 것이다
while( text.indexOf('foo') !== -1 ) { // index를 발견하면
let index = text.indexOf('foo');
// index를 이용해 foo 바로 앞까지의 텍스트를 얻어내고
let beforeText = text.slice(0, index);
// foo 대신 새로운 단어를 넣는다
let replaceText = 'BAR';
// foo 이후의 텍스트를 넣는다
let afterText = text.slice(index + 3); // 'foo'는 세 글자이므로 3을 더함
text = beforeText + replaceText + afterText;
}
return text; // 바뀐 내용을 리턴한다
}
자연스럽게 pseudocode는 주석으로 변경될 수 있습니다.
의사코드(pseudocode) ?
의사(疑似: 비교할 의, 비슷할 사 | Pseudo: 가짜의- ) 코드는 컴퓨터 프로그램이나 알고리즘이 수행해야할 내용을
우리가 사용하는 언어 (한국어 또는 영어 등)로 간략히 서술해 놓은 것을 말합니다.
사용 이유 :
- 코드 검토가 더 쉬워진다.
- 의사코드로 소스코드 실행없이 상세 설계를 검토할 수 있다. 하위 설계 단계의 프로그램을 쉽게 검토할 수 있어 작성된 프로그램의 검토 시간을 줄일 수 있으며 지속적인 프로그램 개선에 큰 도움이 된다.
- 코드 수정을 좀 더 용이하게 만들어 준다.
- 나중에 코드입력, 테스트, 디버그 수정 단계에서 작업하는 것보다 의사코드 설계 단계에서 미리 오류를 수정을 하는 것이 훨씬 경제적이다.
- 코멘트 작성에 대한 부담을 줄여준다.
- 의사코드는 코드 안에 작성한다. 때문에 코멘트가 계속 추가되면서 의사코드 설계 작성이 정교해질 수 있다.
- 나중에 그 프로그램 코드를 읽고 디버깅을 하거나 내용을 수정해야 하는 개발자에게 도움을 줄 수도 있음.
- 컴퓨터 프로그램 알고리즘이 어떻게 실행되어야 할지, 또는 어떻게 실행될 수 있을지 보여줄 수 있음.
- 프로그램의 문제를 해결하기 위한 도구로, 또는 다른 사람들과 프로그램의 흐름에 대해 소통하기 위한 방법으로 활용
의사코드 수정하기.
어려운 부분은 추후에 의사코드에 채워넣을 수 있기 때문에 알고리즘 문제 접근이 용이해진다.
즉, 복잡한 프로그래밍 문제를 단순하게 표현할 수 있다.
차례로, 기능 추가전, 기능 추가후.
파일을 연다.
파일의 각 행(line)에 대해서 단어를 찾는다.
그 단어를 지운다.
그 자리에 새로운 단어를 넣는다.
파일을 닫는다.
파일을 연다.
사용자에게 바꾸고 싶은 단어가 무엇인지 물어 본다.
그리고 그 단어를 어떤 단어로 바꾸고 싶은지 물어 본다.
파일의 각 행(line)에 대해서
단어를 찾기 위해 다음과 같은 과정을 진행한다.
각 글자를 읽어 들인다.
글자가 바꾸고 싶은 단어의 첫 글자와 일치하면,
끝까지 일치하는지 확인해 본 후
일치한다면, 단어를 찾은 것이다.
그 단어가 몇 번 나왔는지 센다.
이제 그 단어에 해당하는 글자들을 지운다.
그리고 그 자리에 새로운 단어에 해당하는 글자들을 채워 넣는다.
단어를 몇 번 바꾸어 주었는지 사용자에게 알려준다.
파일을 닫는다.
의사코드 작성 표준
1. 한줄에 하나의 명령만 쓸 것.
할 일 목록:
이름, 시급, 업무 시간, 공제율(deduction rate)을 확인한다.
계산을 한다.
임금 = 시급 * 업무 시간
공제 = 임금 * 공제율
최종 임금 = 임금 - 공제
이름, 임금, 공제, 최종 임금을 작성한다.
의사코드:
이름, 시급, 업무 시간, 공제율(deduction rate)을 확인한다.
계산한다.
임금 = 시급 * 업무 시간
공제 = 임금 * 공제율
최종 임금 = 임금 - 공제
이름, 임금, 공제, 최종 임금을 파일에 저장한다.
2. 영어로 의사코드 작성할 때, 자주 쓰이는 의사코드 영어 단어
입력(Input): READ, OBTAIN, GET
출력(Output): PRINT, DISPLAY, SHOW
계산(Compute): COMPUTE, CALCULATE, DETERMINE
초기화(Initialize): SET, INIT
요소를 추가(Add one): INCREMENT, BUMP
선형적으로 증가할 때(linear progression): SEQUENCE
반복: WHILE, FOR 조건문: IF-THEN-ELSE
마지막에 조건문이 있는 반복문: REPEAT-UNTIL IF-THEN-ELSE
대신 조건 분기처리: CASE
부울 : TRUE / FALSE
그외 : REPEAT - UNTIL RETURN BEGIN / EXCEPTION / END
3. 어떻게 코드로 표현할지 적지 말고, 하고 싶은 이야기가 뭔지 기록한다.
어떤 개발자들은 "if a % 2 == 1 then"같이 실제 프로그램 코드처럼 의사코드를 작성한다.
이러면 그것을 읽는 사람들은 a, %, == 같은 기호들의 의미를 추측해야 한다.
그 대신 "숫자가 홀수라면(if an odd then)"은 어떨까.
좀 더 쉽고 명확하게 의미를 파악할 수 있을 것이다.
의사코드 적용 예시
prices 클래스를 만듦.
제출 버튼에 이벤트 추가
if bookButtonWrapper의 classList에 "disable" 클래스가 없으면 then {
제출할 form을 만듦.
productId field 번들을 추가, 설정 (json 이용)
displayInfoId field 번들을 추가, 설정. (json 이용)
reservationEmail, reservaionName, reservationTelephone 번들을 추가, 설정.(querySelector 이용)
reservationYearMonthDay를 설정.(querySelector 이용)
prices 배열을 생성.
for 처음부터 ticket_body 클래스 내 qty의 개수만큼 do
var count = qty클래스 내 .count_control_input클래스 의 value
if count가 0이 아니면 then
prices에 productPriceId와 count의 정보를 갖고 있는 객체를 넣음.
endif
prices를 form에 추가.
바디에 form을 추가하고 제출.
}
else {
오류메시지 변수 만들기.
오류메시지 출력.
오류메시지 1초 뒤에 없애기.
}
endif
(출처: sujinlee.me/pseudocode/ , 42kchoi.tistory.com/114)
코드스타일링
Naming – 이름 짓기
- 변수명은 값의 본질적인 의미를 가지고 있어야 합니다.
- 데이터의 모음(collection)이 할당된 변수의 이름은 복수 명사가 좋습니다.
- 변수에 할당되는 값의 형식이 아닌, 그 값의 의미가 변수 이름에 반영되어야 합니다.
- boolean이 할당된 변수는 is 혹은 are을 붙여서 참 혹은 거짓임을 분명히 표현합니다.
- 함수의 이름은 동사로 시작하는게 좋습니다.
- 변수 할당 값이 Class인 경우에 주로 변수의 첫 글자를 대문자로 사용합니다.
- 상수는 모두 대문자로 적습니다.
기호 및 구두점(punctuation)
- 문법적으로 생략 가능한 때에도 중괄호는 생략하지 않습니다.
- JavaScript의 문자열 표시를 위해서 작은 따옴표를 권장합니다.
- 줄 바꿈이 필요한 문자열을 정의할 때는 `(백틱, backtick) 사용을 권장합니다.
- 코드 실행의 가장 작은 단위인 Statement(문)의 끝에 세미콜론을 사용합니다.
- if, for, while문의 끝에는 세미콜론을 사용하지 않아야 합니다.
- 함수 표현식의 끝에는 세미콜론을 사용합니다.
연산자와 키워드
- 엄격한 비교 연산자를 사용하세요
- 3항 연산자(?)는 간결하고 가독성이 좋은 경우만 사용합니다.
- not 연산자(!)는 바로 앞에 붙여서 사용합니다.
짧게 쓰기
- 코드는 뜻이 분명하고 실행 되는 한, 되도록 짧게 쓰세요.
- 부정의 의미가 명확한 곳에만 NOT 연산자를 사용합니다.
- Boolean으로 평가되는 표현문은 바로 return 하세요
코드 문장과 구문 사이 공간
- 한 번에 더 많은 코드를 읽기 위해서, 줄 바꿈은 최소로 사용해야 합니다.
- 들여쓰기는 일관성있게, 최소화하여 사용합니다.
- 같은 라인에 값을 보기 위해 하는 들여쓰기는 지양합니다.
- 콤마(,) 사이는 한 칸 띄어씁니다.
- 연산자 사이는 한 칸 띄어씁니다.
주석
- 주석은 꼭 필요한 경우에만 작성합니다.
- 주석을 적기 전에, 변수 이름과 구조로 코드의 목적이 명확히 표현되면 주석을 적을 필요가 없습니다.
- 주석으로 코드의 작동을 설명하는 것은 지양합니다. 코드를 보고 바로 이해할 수 있을 만큼 가독성이 좋게 코드를 작성해야 합니다.