브루트포스(Brute Force)는 문제를 해결하는 방식 중 하나로, 모든 가능한 경우의 수를 일일이 확인하는 방법을 의미합니다.
let sum = [...String(arr[i])].reduce((a,c) => a + Number(c),0);
이것부터 뜯어보자.
reduce에서 a라는 합산 저장 변수와, 더해줄 요소들을 구해오는 c변수.
그리고 내가 c를 숫자형으로 변환했다.
하지만. a라는 합산 저장 변수는 c라는 부분 요소를 형변환 할지라도
여전히 문자형이다.
초기화값인 숫자타입 0을 통해서....
a 누적 변수도 숫자 타입으로 만들어야 된다. 안그러면 문자 + 숫자 = 문자처럼 + 연산자를 계산.
reduce의 초기값이란, 초기값이 0이라는 수치가 중요한게 아니라...
내가 원하는 타입대로 잘 조종할 수 있도록 돕는 초기화이다.
단, 0으로 초기화 해서 누적타입을 숫자로 맞춘다고 할지라도, 누적값으로 들어오는 c값이 문자 형태라면,
숫자 + 문자 형태는 무조건 문자여서 문자형태로 누적값이 바뀐다. 계산도 문자처럼 concat 된다.
function solution(n, arr){
let sortedArr = arr.sort((a,b) => a-b);
let answer = [...String(sortedArr[0])].map(x => Number(x)).reduce((a,c) => a + c);
let answer2 = sortedArr[0]
for(let i=1; i<arr.length; i++){
if (answer < [...String(sortedArr[i])].map(x => Number(x)).reduce((a,c) => a + c)) {
answer = [...String(sortedArr[i])].map(x => Number(x)).reduce((a,c) => a + c);
answer2 = sortedArr[i]
}else{
if(answer == [...String(sortedArr[i])].map(x => Number(x)).reduce((a,c) => a + c)){
if(answer2 < sortedArr[i]){
answer = [...String(sortedArr[i])].map(x => Number(x)).reduce((a,c) => a + c);
answer2 = sortedArr[i];
}
}
}
}
return answer2
}
let arr=[128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr));
내가 짠 코드이다. 짜는데는 30분 정도 걸렸다.
이제는 스스로 코드 리펙토링도 해서 문제를 푸는데에서 끝이 아니라, 리펙토링에도 신경 써야하지 싶다.
다음은 chatgpt와 답을 보고서 수정한 코드이다.
1. sort부분 삭제.
2. reduce 와 map 부분 합체.
3. 반복 줄임. sum으로 확 줄임.
function solution(n, arr){
let answer;
let max = Number.MIN_SAFE_INTEGER;
for(let i=0; i<arr.length; i++){
let sum = [...String(arr[i])].reduce((a,c) => a + Number(c),0);
if (max < sum) {
max = sum;
answer = arr[i]
}else{
if(max == sum){
if(answer < arr[i]){
max = sum; //제거대상
answer = arr[i];
}
}
}
}
return answer
}
몰랐던 사실. 및 추가내용
else if 와 else { if(){} } 문은 사실 똑같은 것이었다.(충격!)
두 코드는 동일한 코드이다.
그리고 else는 꼭 없어도 된다. 그저 옵션이기 때문이다. if, else if 문 만으로 끝내도 된다.
if (condition1) {
// ...
} else {
if (condition2) {
// ...
} else {
// ...
}
}
if (condition1) {
// ...
} else if (condition2) {
// ...
} else {
// ...
}
else if로 줄이고, 중첩된 문장 max = sum을 제거 했다.
function solution(n, arr){
let answer;
let max = Number.MIN_SAFE_INTEGER;
for(let i=0; i<arr.length; i++){
let sum = [...String(arr[i])].reduce((a,c) => a + Number(c),0);
if (max < sum) {
max = sum;
answer = arr[i]
}else if(max == sum){
if(answer < arr[i]){
answer = arr[i];
}
}
}
return answer
}
자리 수의 합을 구하는 방법은 sum을 문자열로 바꾼 뒤 반복문을 돌리면서 더하는 것도 잇지만,
아래처럼 10을 계속 나누면서 tmp가 0이 될때 while문이 멈추는 식으로도 만들어 줄 수 있다.
let sum = 0; tmp = arr[i];
while(tmp){
sum+= (tmp %10);
tmp = Math.floor(tmp / 10);
}