일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 코린이
- 리액트
- 사전준비
- typeScript
- 챗GPT
- 알고리즘기초주차
- NotionAI
- 항해99
- 웹개발종합반
- 실전프로젝트
- 프로그래머스
- 필수강의
- 멍친구
- rn
- 달리기반
- 7기
- 맥린이
- Programmers
- ReactNative
- Ai
- 프론트엔드
- Expo
- REACT
- 알pdf #파일탐색기미리보기안될때
- 스파르타코딩클럽
- TDD
- D반8조
- ChatGPT
- 팀워크최고
- TS
- Today
- Total
FrontEnd :-)
[항해99] programmers 코딩테스트 연습문제 24~29 본문
[항해99] 프로그래밍 기초 주차 / 달리기반 / 7기 / D반 / 9조
코딩테스트 연습문제
24. 점수 내림차순으로 배치하기
(문제)
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.제한 조건
- n은 1이상 8000000000 이하인 자연수입니다.
(제출 답)
function solution(n) {
var answer = 0;
let pre = n.toString().split('').sort((a,b) => b - a);
answer = pre.map(a =>parseInt(a)).join('');
return Number(answer);
}
✅ 풀이 과정
<함수 아는 거 다 때려넣은 느낌... 너무 복잡하게 되었는데, 못해서 그런거다>
🤼♀️ 다른 풀이 1 (깔끔하다. reverse()를 썼고, 문자열에 +만 해줘도 숫자로 변하는 걸 적용했고)
function solution(n) {
const newN = n + "";
const newArr = newN
.split("")
.sort()
.reverse()
.join("");
return +newArr;
}
🤼♀️ 다른 풀이 2 (숫자, 문자 풀이 다 해 본 사람. 숫자가 빠르겠죠.. 알지만 잘 몰라서 못하는 거)
function solution(n) {
//숫자가 분명히 더 빠름
var nums =[];
do{
nums.push(n%10);
n=Math.floor(n/10);
} while(n>0)
return nums.sort((a,b)=>b-a).join('')*1;
//문자는 느림
return (n+"").split('').sort((a,b)=>b-a).join('')*1;
}
⏩ 추가학습
25. 정수 제곱근 판별
(문제)
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
(제출 답)
function solution(n) {
let a = Math.sqrt(n)
return a % 1 === 0 ? (a+1)*(a+1) : -1;
}
✅ 풀이 과정
🤼♀️ 다른 풀이
⏩ 추가학습
26. 제일 작은 수 제거하기(음..? 공부 필요)
(문제)
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.제한 조건
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
(제출 답)
function solution(arr) {
arr.splice(arr.indexOf(Math.min(...arr)),1);
if(arr.length<1) return[-1];
return arr;
}
✅ 풀이 과정
splice()
splice를 이용하면 원하는 위치에 요소를 추가하거나 삭제할 수 있다.
실패 1
indexOf를 모르니 안 풀린..답 찾아봄.
🤼♀️ 다른 풀이
⏩ 추가학습
indexOf :문자열에서 부분 문자열(substring)을 찾기
string.indexOf(searchvalue, position)
27. 콜라츠 추측 (다시 풀어보기)
(문제)
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
제한 사항
- 입력된 수, num은 1 이상 8000000 미만인 정수입니다.
(제출 답)
function solution(num) {
for (let i = 0; i < 500; i++){
if (num%2===0){
num = num/2
} else if(num===1){
return i;
}else if(num%2===1){
num= num*3 + 1
}
}
return -1;
}
✅ 풀이 과정
< i 의 값을 셀 수 있다는 사실을 알았다. (반복문의 횟수 세기)>
실패 (num을 n으로 했기 때문이라는 어이 없는 실패)
🤼♀️ 다른 풀이1
function solution(num) {
var answer = 0;
for (let i=0; i <500; i++){
if (num != 1){
num = num % 2 == 0? num / 2 : num *3 + 1;
} else {
return answer = i;
}
}
return answer = -1;
}
🤼♀️ 다른 풀이2 (신기)
function collatz(num,count = 0) {
return num == 1 ? (count >= 500 ? -1 : count) : collatz(num % 2 == 0 ? num / 2 : num * 3 + 1,++count);
}
🤼♀️ 다른 풀이3 (두 가지 조건을 만족하는 걸로 뭔가 해보자 했었는데, 난 못했고, 이 분은 했다)
function collatz(num) {
var answer = 0;
while(num !=1 && answer !=500){
num%2==0 ? num = num/2 : num = num*3 +1;
answer++;
}
return num == 1 ? answer : -1;
}
🤼♀️ 다른 풀이4 (신기2)
function solution(num, i) {
i = i == undefined ? 1 : i;
if(num % 2 == 0) {
num = num / 2;
} else {
num = num * 3 + 1;
}
if(num == 1) {
return i;
}
if(i == 500)
return -1;
return solution(num, ++i);
}
⏩ 추가학습
28. 하샤드 수
(문제)
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.제한 조건
- x는 1 이상, 10000 이하인 정수입니다.
(제출 답)
function solution(x) {
return x/(x.toString().split('').reduce((a, b)=> a*1 + b*1)) % 1 == 0
}
✅ 풀이 과정
22번 자릿수 더하기, 23번 자연수 뒤집어 배열로 만들기를 참고하여 금방 완성!
1) 두자릿수 이상의 수를 분리하려면 문자열로의 변환이 필요. toString()
2) 따로 따로 떨어뜨리기. split('')
3) 값을 모두 더하기 reduce((sum, cur) => sum + cur
3-1) a*1 과 b*1은 문자열을 숫자로 변환한 것
4) 정수는 1로 나눴을 때 나머지가 없는 수 % 1 == 0
5) 끝. 비교연산자이기 때문에 값은 true 또는 false로 출력
🤼♀️ 다른 풀이 (나눠서 %1=0 할 필요 없이, %로 나누고 그 값이 0이면 false, 1이면 true값이 반환되는데, 그 반대여야 하니까 !를 붙여 완성한 식)
아래는 누군가의 댓글 설명,
( "나머지 값이 0과 1만 나온다고 했을 때 js에서 0은 false, 1은 true로 출력합니다. 문제에서 나누어 떨어질 때(즉, 나머지가 0일 때) true, 나누어 떨어지지 않을 때(나머지가 1일 때)는 false를 출력하라고 했으니까 !를 붙여서 false는 true로, true는 false가 되도록 한 것")
function Harshad(n){
return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}
⏩ 추가학습
29. 3진법 뒤집기
(문제)
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.
(제출 답)
function solution(n) {
var a = n.toString(3).split('').reverse().join("")
return parseInt(a, 3);
}
✅ 풀이 과정
🤼♀️ 다른 풀이1
const solution = (n) => {
return parseInt([...n.toString(3)].reverse().join(""), 3);
}
🤼♀️ 다른 풀이2
function solution(n) {
const answer = [];
while(n !== 0) {
answer.unshift(n % 3);
n = Math.floor(n/3);
}
return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);
}
🤼♀️ 다른 풀이3
function solution(n) {
var answer = 0;
let _3 = {};
let x = 0;
while (3**++x < n);
if(3**x !== n) x--;
let max = x;
for (let i = x; i>=0; _3[i--] = 0);
while(x>0){
while(3**x <= n){
n -= 3**x;
_3[x] = _3[x]+1;
}
x--;
}
_3[x] = n;
for ( let key in _3){
if(_3[key]) answer += (3**max * _3[key]);
max--;
}
return answer;
}
⏩ 추가학습