심심하기도 하고, 오랜만에 머리도 써볼겸 스스로 도전 과제를 부여하고 해결해보기로 하였습니다.
그렇게 생각해 낸 오늘의 도전과제는 짝수만 출력하기.
예를 들어 2, 4, 6, 8, 10 ...... 과 같이 콘솔창에 짝수만 출력할 수 있도록 코드를 짜보는 것입니다.
어찌보면 간단할 수도 있지만, 다양한 방법으로 풀어보는데 의의를 두고 진행해보려고 합니다.
쉬운 방법부터 천천히 해보겠습니다.
사용 언어는 최근에 자주 쓰던 자바스크립트로 결정했습니다.
알고리즘 쪽을 할때엔 C나 C++을 주로 사용했었지만, 자바스크립트 숙련도를 높이고 싶은 마음에 이렇게라도 써보려고 합니다. 실제로 숙련이 될지는 미지수지만!
- 첫 번째 방법. 반복문만 이용하는 경우
짝수 변수를 생성하여 2씩 더하는 반복문에 넣어줌으로써 결과적으로 짝수만 출력이 되도록 코드를 작성하였습니다.
1
2
3
|
for(let num = 2; num <= 10; num = num + 2) {
console.log(num);
}
|
cs |
세 줄짜리 간단한 코드가 되었습니다. (사실 괄호를 사용하지 않으면 한 줄입니다)
그럼 한 번 ideone.com 에 위 코드를 입력하고 실행해보겠습니다.
성공. 깔끔하게 잘 나오는군요.
번째 방법. 조건문을 이용하는 경우
첫 번째 방법에 이어서, 이번에는 조건문을 이용해보겠습니다.
아까와 마찬가지로 변수를 생성해서 반복문에 넣어주되, 생성된 변수가 짝수인지 홀수인지 판별하여 짝수일 경우에만 출력이 되도록 작성하였습니다.
1
2
3
4
|
for(let num = 1; num <= 10; num++) {
if (num%2 === 0)
console.log(num);
}
|
cs |
생성되는 변수는 1부터 10까지 홀수를 포함하여 조건문에 넘겨지고, 이 중 짝수 (나누어서 나머지가 0인 수) 만 콘솔에 찍히도록 코드를 작성하였습니다.
이번에도 괄호를 사용하지 않는다면 한줄입니다. 하지만 가독성은 소중하기에 남겨주었습니다.
정상적으로 짝수만 출력되는 모습입니다.
이렇게 두 가지 방법으로 짝수를 출력해보았습니다.
자바스크립트를 처음 접하는 초보분들게서 간단히 연습해볼만한 난이도가 아닌가 생각합니다.
저로써도 좋은 연습이 되었고, 앞으로도 꾸준히 공부해야 될 것 같네요.
짧은 글 읽어주셔서 감사합니다.
사실 이 글은, 지금부터가 본편입니다.
이렇게 끝내긴 뭔가 아쉽잖아요 ㅎㅎ
번째 방법. 반복문과 조건문을 이용하지 않는 경우
앞의 방법들은 모두 반복문과 조건문들을 이용하여 짝수를 출력하였습니다.
홀수와 섞여있는 입력에서 짝수를 판별하기도 하고, 처음부터 짝수만을 집어넣어주기도 하였습니다.
그렇다면 반복문과 조건문을 이용하지 않고도 짝수를 출력할 수 있을까요?
우선 조건문을 사용할 수 없기에, 짝수 판별은 할 수 없습니다.
그렇다면 입력 단계에서 짝수만을 출력해주어야 하는데, 단순히 배열에 { 2, 4, 6, 8, 10 } 을 넣고 출력하는건 Fun하고 Cool하고 Sexy하지 못하다는 생각이 들었습니다.
그래서 이번에는 짝수의 규칙을 찾아, 직접 생성하여 보겠습니다.
먼저 규칙을 찾기 위해 우리가 출력하려는 짝수를 살펴봅시다.
{ 2, 4, 6, 8, 10 }
2씩 더한수 / 2로 나누었을때 나머지가 0인 수 / 2n (n은 자연수)
다양한 규칙들이 있지만 뭔가 부족합니다.
조금 더 컴퓨터스럽게 생각해보았습니다.
{ 10, 100, 110, 1000, 1010 }
이제서야 조금 보이는 것 같습니다.
조금 더 정확한 규칙성을 찾아보기 위해 20까지 확인해보겠습니다.
{ 1100, 1110, 10000, 10010, 10100 }
그럼 위의 이진수로 나타낸 짝수들에서 공통점을 찾아봅시다.
1. 마지막 자리가 0으로 끝난다.
2. 첫 자리는 1로 시작한다. (0이 아니다)
이제 조건에 부합하는 짝수를 만들 규칙을 알게 되었습니다.
지금까지 알아낸 사실을 바탕으로 입력값을 생성하는 함수를 만들어보겠습니다.
먼저 이진수 1 (십진수 1) 을 매개변수로 받고, 위 규칙을 이용해 계속해서 짝수만을 생성하는 함수를 만들어줍니다.
그리고 크기에 따라 오름차순으로 콘솔창에 출력해주면 될 것 같습니다.
다만 반복문을 사용할 수 없으니, 반복하는 작업을 수행하기 위해 함수를 여러 번 호출해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
function GenerateBinaryNum(i) {
let num1 = i + '0';
let num2 = i + '10';
return [num1, num2];
}
function printConsole() {
let initNum1 = GenerateBinaryNum(1)[0];
let initNum2 = GenerateBinaryNum(1)[1];
console.log(parseInt(initNum1, 2));
console.log(parseInt(GenerateBinaryNum(initNum1)[0], 2));
console.log(parseInt(initNum2, 2));
console.log(parseInt(GenerateBinaryNum(GenerateBinaryNum(initNum1)[0])[0], 2));
console.log(parseInt(GenerateBinaryNum(initNum1)[1], 2));
}
printConsole();
|
cs |
코드가 더러워 보입니다만, 어찌어찌 출력은 되었습니다. 사실상 반복문을 사용하지 않았다 뿐이지 하나하나 넣어준것과 근본적으로는 크게 다르지 않습니다. 이런 경우 10이 아니라 100까지의 짝수를 출력해야 하는 조건이면 큰 골머리를 앓게 될 수 밖에 없습니다. 코드를 짜기 전 처음 생각했던것은 재귀함수를 이용하는 것이었는데, 그 함수의 원형은 이렇습니다.
1
2
3
4
5
6
7
8
9
10
|
function GenerateBinaryNum(i) {
let num1 = i + '0';
let num2 = i + '10';
console.log(num1);
console.log(num2);
GenerateBinaryNum(num1);
GenerateBinaryNum(num2);
}
|
cs |
이런식으로 재귀함수를 사용하면 반복문 없이도 여러번의 작업을 할 수 있다는 장점이 있지만 이대로 진행되게 되면 큰 문제점이 하나 있습니다. 바로 무한히 반복된다는 점입니다.
어떠한 분기에서 (예를 들면 return 값이 10보다 작거나 같을때까지만) 재귀를 멈추고 break 해줘야하지만, 제어를 위해 필요한 조건문을 쓰지 않기로 하였기에 break를 하지 못하고 timeout이 나버리고 맙니다.
결국 조건문과 반복문을 모두 사용하지 않고 짝수만 출력하는 것은 반쪽짜리 성공이 되었습니다.
완벽하지 못한 코드만 남아 용두사미가 된 감은 있지만, 오랜만에 로직에 대해서 고민해보았다는 점에 의의를 두어야 할 것 같습니다. 이런식으로 고민하고 문제를 푸는듯한 코딩은 안한지 오래 되었는데, 백준 알고리즘 문제를 푸는 느낌도 나고 꽤 재미있었습니다.
저는 실패했지만, 혹여 더 좋은 방법을 알고 계신다면 덧글로 알려주시면 감사하겠습니다!
오늘의 삽질은 여기까지.
'이론 > Frontend' 카테고리의 다른 글
싱글 쓰레드 Javascript의 비동기적 동작 (0) | 2020.09.07 |
---|---|
React에서 PC/모바일 각각 라우팅하기 (0) | 2020.07.16 |
React에서의 proptypes validation (0) | 2020.07.02 |
React 프로젝트 gh-pages 배포시 git-upload-pack: command not found 오류 (2) | 2020.06.26 |
기본적인 jQuery 내용 정리. (0) | 2019.10.14 |
댓글