2021.11.08
알고리즘 기초에 대해 학습하는 주간이 되었다.
(그리고 오늘은 나의 찐전역날 ㅎㅎ 이제 민간인이다!)
알고리즘은 처음인데 나름 해결해나가는 재미가 있는 것 같다.
아직 완전 기초단계라 그런 것 같기도 하고.
오늘은 1번~12번, 15번, 18번의 알고리즘을 풀었다.
그 중에 리마인드가 꼭 필요하다고 생각한 알고리즘과 메소드 몇 가지에 대해 다뤄보려 한다.
스포가 있을 수 있으니 아직 안 풀어보신 분들은 뒤로가기!
사용 언어 : 자바스크립트
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.
a | b | return |
---|---|---|
3 | 5 | 12 |
3 | 3 | 3 |
3 | 5 | 12 |
a 랑 b 대소비교.
a가 작으면 a부터 b까지의 숫자를 더한다.
b가 작거나 같으면 b부터 a까지의 숫자를 더한다.
function solution(a, b) {
let answer;
if (a >= b) {
answer = b;
for (let i = b + 1; i <= a; i++) {
answer += i;
}
} else{
answer = a;
for (let j = a + 1; j <= b; j++) {
answer += j;
}
}
return answer;
}
if 문 안에 answe = b, answer = a 주지 않고 for 문 안에서 i = b랑 i = a 로 해서 돌렸으면 더 깔끔했을 텐데 아쉬움이 남는 코드다.
제출할 때 항상 동작만 되면 냅다 제출했더니 코드들이 좀 더러운 면이 있는 것 같다..
제출하고 다른 사람 코드를 보는데 감탄이 나온 코드가 있다.
unction adder(a, b) {
var result = 0;
return ((a + b) * (Math.abs(b - a) + 1)) / 2;
}
한 줄 만에 끝내다니,,,,;;
가우스의 공식을 응용한 것이다.
양 끝 합의 값과 합의 개수를 곱하여 a부터 b까지의 합을 구했다.
Math.abs() 함수는 주어진 숫자의 절대값을 반환합니다. x가 양수이거나 0이라면 x를 리턴하고, x가 음수라면 x의 반대값, 즉 양수를 반환합니다
출처 MDN
String형 배열 seoul의 element중 Kim의 위치 x를 찾아, 김서방은 x에 있다는 String을 반환하는 함수, solution을 완성하세요. seoul에 Kim은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
Kim은 반드시 seoul 안에 포함되어 있습니다.
seoul | return |
---|---|
["Jane", "Kim"] | "김서방은 1에 있다." |
for문으로 soeul 배열의 길이만큼 돌린 후 해당 index 번호를 산출
function solution(seoul) {
let answer = "";
for (let i = 0; seoul.length; i++) {
if (seoul[i] === "Kim") {
answer = `김서방은 ${seoul.indexOf("Kim")}에 있다`;
return answer;
}
}
}
너무 멍청하게 짠 코드,,
쓸데없는 코드가 많고, 복잡하게 짰다.(상당한 짬뽕코드가 돼버렸다.)
이것도 작동한다고 냅다 제출한 결과다..
위 코드는 for문을 돌렸기 때문에 indexOf라는 메소드를 쓸 필요 없이 i를 집어넣거나,
for문을 빼고 indexOf만으로 훨씬 간결하게 해결할 수 있던 코드였다.
앞으로는 로직을 확실히 구상하고 좀 더 간결한 방법이 있진 않은지, 돌아서 가고 있진 않은지 꼭! 고민해보고 제출해야겠다
나는 문제를 풀 때 대부분 if문과 for문을 사용하여 풀이를 했다.(근본)
그런데 다른 사람들을 보니 reduce, slice, map, repeat, 화살표 함수, 삼항 연산자 등 다양한 방법으로 훨씬 간결하게 풀고 있었다.(다 처음보는 거다 holy,,) 이러한 메소드들을 공부하여 다음부턴 적용할 수 있도록 노력해 봐야겠다.
(그리고 문제 제출하고 나면 다른사람들 풀이 보면서 자괴감이..)