문제 설명
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
제한사항
3 ≤ n ≤ 1,000,000
입출력 예
n | result |
---|---|
10 | 3 |
12 | 11 |
입출력 예 설명
입출력 예 #1
10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.
입출력 예 #2
12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.
// 처음 생각한 코드
function solution(n) {
var answer = 0;
for (let i = 2; i < n; i++) {
if (n % i === 1) {
answer = i;
}
}
return answer;
}
위 코드의 문제점은 제일 작은 값을 찾았어도 계속 for문이 실행되기 때문에 가장 작은 값이 나오면 멈추게 설정을 해줘야한다.
break를 사용하는 방법을 찾아 넣어줬더니 해결되었다.
function solution(n) {
var answer = 0;
for (let i = 2; i < n; i++) {
if (n % i === 1) {
answer = i;
break;
}
}
return answer;
}
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
제한사항
N의 범위 : 100,000,000 이하의 자연수
입출력 예
N | answer |
---|---|
123 | 6 |
987 | 24 |
입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.
숫자를 배열로 나눠서 배열의 값을 for문으로 더해주면 될 것 같았다. 하지만 숫자를 바로 나누는 방법은 찾지 못해 toString을 사용해 문자열로 변경 후 split을 사용하여 배열로 변경해줘야했다.
나눠진 문자열 배열을 숫자로 변경하는 방법에 대해 고민을 했으나 검색 끝에 map(Number)를 사용하면 모든 배열을 숫자로 타입을 변경할 수 있었다.(참고링크: https://ko.code-paper.com/javascript/examples-javascript-convert-an-array-of-strings-to-numbers)
function solution(n) {
var answer = 0;
let x = n.toString().split('').map(Number);
for (let i = 0; i < x.length; i++) {
answer += x[i];
}
return answer;
}
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
n | return |
---|---|
121 | 144 |
3 | -1 |
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
처음 루트를 반환하는 함수인 Math.sqrt()를 알게 되고 루트를 씌운 값이 정수일 때와 아닐 때를 비교하여 값을 넣으면 결과가 나올 것이라고 생각이 들었다.
function solution(n) {
if (Math.sqrt(n) % 1 === 0) {
answer = (Math.sqrt(n) + 1) * (Math.sqrt(n) + 1);
} else {
answer = -1;
}
}
위처럼 진행해도 답은 나오나 코드가 효율적이지 못하다고 생각하였다. Math.pow()를 이용하면 제곱을 할 수 있다는 것을 찾게 되었고 삼항 연산자를 사용하면 더 짧게 코드를 만들 수 있다는 생각이 들어 바꿔보았다.
function solution(n) {
return Math.sqrt(n) % 1 === 0 ? Math.pow(Math.sqrt(n)+1, 2) : -1;
}
reference
https://school.programmers.co.kr/
https://www.w3schools.com/js/js_break.asp
https://ko.code-paper.com/javascript/examples-javascript-convert-an-array-of-strings-to-numbers
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt
https://webisfree.com/2018-06-27/[%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8]-%EB%A3%A8%ED%8A%B8%EC%99%80-%EC%A0%9C%EA%B3%B1-%EA%B5%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95