자릿수의 합
문제 :
N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고 그 합이 최대인 자연수를 출력하세요 자릿수의 합이 같은경우에는 원래 숫자가 더 큰숫자를 답으로 지정합니다. 235 와 1234 가 동시에 답이 된다면 1234를 답으로 출력합니다.
입력설명 :
N개의 자연수의 갯수가 주어지고 그 다음줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 10,000,000 를 넘지 않는다.
출력설명 :
자릿수의 합이 최대인 자연수를 출력한다.
<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(input){
let answer = 0, max =Number.MIN_SAFE_INTEGER;
for(let x of input){
let sum =0, tmp = x; //원본값 저장을 위해서 임시 변수설정
while(tmp){
sum += tmp%10; // x 의 나머지값을 누적
tmp = Math.floor(tmp/10); // 몫을 tmp에 저장
}
if(sum > max){
max = sum;
answer = x;
}else if(sum === answer){
if(x > answer){
answer = x;
}
}
}
return answer;
}
let input = [128, 460, 603, 40, 521, 137, 123];
console.log(solution(input));
</script>
</body>
</html>
방법은 2가지의 방법이 있다. 한가지는 String으로 변환후에 내장메소드를 사용하는방법과 또 다른 한가지는 숫자계산을 이용해서 문자로 바꾸지 않고 해결하는 방법이 있다. 아무래도 내장메소드를 사용하지 않고 숫자만을 사용해서 문제 해결하는방법이 더 좋다고 생각한다 코드도 간결해지고 프로그램 도 가벼워지지 않을가 라는 생각이 든다.
하나씩 살펴보도록 하자
우선 어떤 변수가 필요한지 차근차근 살펴보자
1. return 하는 answer변수가 필요한데 우리가 반환해야하는값은 숫자이니까 0으로 선언해주었다
2. 우리는 자릿수의 합중에 가장 큰 값을 구해야 하니까 max 라는 최댓값이라는 변수를 만들어야한다 input[0] 을 선언해주어도 상관은 없겠지만 좀더 안정적이게 Number.MIN_SAFE_INTEGER 메소드로 선언 해주었다.
자 이제 입력한 배열을 불러올 차례다 배열에 let input =[128,460,603,40,521,137,123]; 로 선언했다.
우선 input 배열에 있는 모든 숫자의 자릿수를 다 합할것이니 향상된 for of 으로 x라는 변수에다가 input 요소를 다 한번씩 돌면서 자릿수를 구해야한다. 자 여기서는 2가지 방법이 있으나 일단 숫자로만 처리하는 방법으로 접근하겠다.
우리에겐 % 라는 연산이 있다 128%10을 한다면 128 을 10으로 나누고 나머지 값을 반환하는 연산이다 자 만약에 연속적으로 나머지값을 하나씩 가져온다면 숫자 뒤자리 부터 하나씩 += 누적 계산을 할수 있다면 input 배열 요소의 자릿수의 합을 구할수 있을것이다 예컨데 128 / 10 을 한다면 12.8 이 된다 그렇다면 0.8 값이 나머지 값인데 이 나머지 값을 sum 합계라는 변수에 누적시켜준다 다시 12 / 10 을 나누고 그 나머지 값은 0.2 값이 될것이고 1/10 은 0.1.로
나머지 값을 하나씩 sum에 누적 시켜준다면 sum 에는 8 + 2 + 1 계산이 들어가고 총합 11이 될것이다.
그럼 우리가 원하는 각 배열의 자릿수의 합은 sum에 들어가게 된다!
이런식으로 for 문으로 모든 배열의 요소를 while 문을 통해서 자릿수의 합을 구할것이다.
자 자릿수들의 합을 구했다면 가장큰 자릿수의 합을 구할차례이다 우리는 최댓값을 구할것인데 미리 선언한 max 변수를 사용하면 된다
if문을 사용하여서 sum 값이 max 보다 크다면 max = sum 을 해주어서 max 에는 각 배열의 자릿수의 최댓값이 들어가게 된다 여기까지만 하더라고 사실 입력받은 배열의 자릿수의 최댓값을 구했지만 문제에는 또 다른것도 요구했다 바로 자릿수의 합이 같을시에는 자연수의 수가 더 큰 값을 정답으로 출력하라고 명시했다.
자 그렇다면 if문을 사용해서 만약에 sum값이 answer 의 값이 같다면 x (input 배열의 요소) 보다 answer 의 값이 크다면 answer = x; 로 자연수가 더 큰 값을 answer라는 변수에 저장해주었다.
< <html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<body>
<script>
function solution(input){
let answer =0 , max=Number.MIN_SAFE_INTEGER, sum =0;
for(let x of input){
sum = x.toString().split('').reduce((a,b) => a + Number(b),0);
if(sum > max){
max = sum;
answer = x;
}else if(sum === answer){
if(x> answer) answer = x;
}
}
return answer;
}
let input =[128, 460, 603, 40, 521, 137, 123];
console.log(solution(input));
</script>
</body>
</html>
이 코드 같은 경우엔 내장함수를 사용해서 문제를 해결했다 최댓값을 구하는 코드 와 그리고 자릿수의 합이 같을시 더 큰 자연수의 값을 answer 에 담는것은 위 코드와 동일하다 다른것은 배열의 자릿수의 합을 구하는 코드가 다르다
사실 내장함수 쓰는것이 더 간단하고 직관적으로 보기 편한것 같다.. 어떤 스타일이 더 좋은건지는 좀더 검색을 통해 알아봐야 겠다. 개인적으로는 내장함수쓰는것이 문과출신으로썬 훨씬 편하고 마치 글을 읽는것 같아서 직관적이다 사설이 길었다.. 하나씩 살펴보겠다
우선 sum 이라는 변수는 필요하다 자릿수의 합을 구해야하니깐
sum변수에 들어오는 x(input 배열 요소) 를 toString() -> 문자열로 반환 split('') -> 문자를 하나씩 쪼개서 반환
reduce((a,b)=> a + Number(b), 0); 메소드로 이때 reduce 메소드는 a는 누적되는 변수고 b는 현재값을 나타난다 자 우리는 숫자를 문자열로 바꾸고 하나씩 쪼갰다 만약 x 변수에 128 이라는 문자열이 들어갔다면 그 문자열은
toString() 에 "128" 로 변경되었고 tosplit('') 에는 '1','2','8' 로 바뀌었다 자 이젠 이것들은 다시 숫자열로 바꿔주고 합해주면 자릿수의 합을 구할수 있다 reduce 함수를 이용해서 Number(b) 는 '1','2','8' 들을 숫자로 -> 1,2,8 으로 바꿔주고 a 라는 누적되는곳에 하나씩 더해준다면 1+ 2 + 8 이 되고 sum에는 11이라는 값이 들어가는것이다.
'JavaScript 알고리즘' 카테고리의 다른 글
등수출력 프로그램 작성하기. (0) | 2022.04.08 |
---|