[JS] 코딩테스트 연습 - 1 (TIL)

이해용·2022년 9월 11일
0
post-thumbnail

나머지가 1이 되는 수 찾기

문제 설명
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

제한사항
3 ≤ n ≤ 1,000,000

입출력 예

nresult
103
1211

입출력 예 설명

입출력 예 #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 이하의 자연수

입출력 예

Nanswer
1236
98724

입출력 예 설명

입출력 예 #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 이하인 양의 정수입니다.

입출력 예

nreturn
121144
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

profile
프론트엔드 개발자입니다.

0개의 댓글