4장은 완전탐색(블루투포스)이다. 배열등의 모든 원소를 완전이 탐색하여 푸는 문제 유형이다.
N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하세요. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 합니다. 만약 235 와 1234가 동시에 답이 될 수 있다면 1234를 답으로 출력해야 합니다.
[입력설명]
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 10,000,000를 넘지 않는다.
[출력설명]
자릿수의 합이 최대인 자연수를 출력한다.
7
128 460 603 40 521 137 123
137
Math.floor(tmp/10)
과 ParseInt(tmp/10)
은 소수점을 삭제하고 정수를 리턴한다. parseInt는 앞에서 봤던 것 처럼 String을 2-36진수로 바꾸는 역할도 한다. x.toString()
: x를 String화 한다.x.split('')
: x문자를 ''로 쪼개고, 배열화한다. reduce((a, b) => a + Number(b), 0)
: a는 누적값(초기값 0, 2번째 매개변수), b는 현재값이다. 그리고(화살표함수) a + Number(b)를 리턴한다.a=0에서 b를 계속 바꿔가며 더한다. Number(answer.join(''))
: answer 배열을 ''로 합친 후, Number화 한다. 코드1은 내장함수를 사용하지 않는 방법이다.
(1) for of를 통해 배열의 원소 모두를 탐색한다.
(2) 각 자리수의 합을 구한다.
(3) 가장 큰 합을 answer에 대입하여 return한다. (자릿수의 합이 같은 경우에는 큰 수를 답으로 한다)
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(n, arr){
let answer, max=Number.MIN_SAFE_INTEGER;
for(let x of arr) {
let sum=0, tmp=x;
//tmp가 0이되면 끝, 각 자릿수의 합
while(tmp){
sum+=(tmp%10);
tmp=Math.floor(tmp/10);
}
if(sum>max){
max=sum;
answer=x;
}
//같을 때는 큰숫자가 답이 됨
else if(sum===max){
if(x>answer) answer=x;
}
}
return answer;
}
let arr=[128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr));
</script>
</body>
</html>
코드2는 내장함수를 사용한다.
(1) for x of arr
(2) x를 문자로 바꾼 후, split을 통해 배열화한다.
(3) 배열화된 x의 각각을 reduce 메소드를 통해 더한다. (더할 때 숫자화할것)
(3) 가장 큰 합을 answer에 대입하여 return한다. (자릿수의 합이 같은 경우에는 큰 수를 답으로 한다)
<html lang="en">
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(n, arr){
let answer, max=Number.MIN_SAFE_INTEGER;
for(let x of arr){
x=x.toString();
x=x.split('');
let sum=x.reduce((a, b)=>a+Number(b), 0);
if(sum>max){
max=sum;
answer=x;
}
else if(sum===max){
if(x>answer) answer=x;
}
}
answer=Number(answer.join('')); //answer 배열의 원소를 합친 후, 숫자로 변환
return answer;
}
let arr=[128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr));
</script>
</body>
</html>
9/11
코드2 간소화: 코드2대로 메소드를 분리해서 작성하면, x는 배열의 형태이기 때문에 문자로 변환하는 코드가 추가로 있어야 함
answer=Number(answer.join(''))
하지만, 아래코드는 불필요