문제29: 3진법 뒤집기
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.
나의코드)
function solution(n) {
var third = n.toString(3);//3진법 변환
let newStr=third.split("").reverse().join("")
let answer =parseInt(newStr,3)
return answer;
}
나의풀이)
n=125
a=Number(n.toString(2))//1111101
a=Number(n.toString(3))//11122
a=Number(n.toString(4))//1331
a=Number(n.toString(5))//1000
a=Number(n.toString(6))//325
a=Number(n.toString(7))//236
a=Number(n.toString(8))//175
a=Number(n.toString(9))//148
a=Number(n.toString(10))/125
console.log(a)
.toString()의 괄호안에 변환하고 싶은 진법의 수를 넣으면 그 수의 진법으로 숫자가 바뀌게 된다. 이때 n.toString(10)은 원래의 수와 같은값인데, 이는 우리가 쓰고 있는 숫자를 기본적으로는 10진법으로 계산하기 때문이다. 따라서 n진법에서 10진법으로 바꿀 때는 toSting(바꾸고 싶은 진법의 수)을 사용하는 것이 가능하지만, n진법을 10진법으로 바꾸기 위해서 toSting(10)을 쓰는 것이 불가능하다.
n="22111"
console.log(parseInt(n,3));//229
n=22111
console.log(parseInt(n,3));//229
n진법을 10진법으로 바꾸기 위해서는 parseInt(바꾸고싶은숫자or문자,현재 숫자의 진법체계)를 써서 10진법으로 바꾼다
문제30 : 최소 직사각형
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
명함 번호가로 길이세로 길이1 | 60 | 50 |
2 | 30 | 70 |
3 | 60 | 30 |
4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
제한사항
- sizes의 길이는 1 이상 10,000 이하입니다.
- sizes의 원소는 [w, h] 형식입니다.
- w는 명함의 가로 길이를 나타냅니다.
- h는 명함의 세로 길이를 나타냅니다.
- w와 h는 1 이상 1,000 이하인 자연수입니다.
입출력 예sizesresult
[[60, 50], [30, 70], [60, 30], [80, 40]] | 4000 |
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] | 120 |
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] | 133 |
나의코드)
function solution(sizes) {
var answer = 0;
let min=[];
let max=[]
let maxMin=0
let maxMax=0;
for(i=0;i<sizes.length;i++){
min.push(Math.min(sizes[i][0],sizes[i][1]))
maxMin=Math.max(...min)
}
for(i=0;i<sizes.length;i++){
max.push(Math.max(sizes[i][0], sizes[i][1]))
maxMax=Math.max(...max)
}
answer=maxMin*maxMax
return answer;
}
나의 풀이)
문제를 푸는 알고리즘은 다음과 같다. sizes가 [[14,4],[19,8],[6,16],[18,7],[7,11]]로 주어진다고 가정하자. 각 size[i]는 가로와 세로 두개의 값으로만 이루어져있다. 이 두개 중 작은 것들을 min이라는 배열에 담고, 큰 것들을 max라는 배열에 담는다. min과 max는 각각 [4,8,6,7,7]과[14,19,16,18,11]이 될 것이다. 이번에는 이중에서 각각 최대값을 선택해야한다. max값들 중 최대값을 maxMax라고 하고 Math.floor()을 이용해 max배열들 중 최고값을 할당한다. min값들 중 최대값을 minMax라고 하고 마찬가지로 max 배열들 중 최고값을 할당한다. 이 둘의 곱이 지갑의 최소 사이즈가 된다.
console.log(Math.max(1,2))//2
console.log(Math.max(1,2,3))//3
let arr=[1,2,3,4,5]
console.log(Math.max(arr))//Nan
console.log(Math.max(...arr))//5
Math.max()를 이용하여 숫자들 중 가장 큰 값을 찾을 수 있는데, 배열의 요소들 중 가장 큰 값을 구할 때는 배열의[ ]을 제거해주는 ...을 넣어줘야 한다. 이를 스프레드 문법이라고 한다.
문제31:같은 숫자는 싫어
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
- arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
- arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
제한사항
- 배열 arr의 크기 : 1,000,000 이하의 자연수
- 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
나의코드)
function solution(arr){
answer=[];
for(i=0;i<arr.length;i++){
if(arr[i+1]!=arr[i]){
answer.push(arr[i])
}
}return answer
}
나의 풀이)
answer를 빈 배열로 만든 뒤, arr[i+1]이 arr[i]와 같지 않을 때만 arr[i]의 값을 answer에 추가. for문이 모두 끝났을 때 answer을 리턴
문제32: 두 개 뽑아서 더하기
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers의 길이는 2 이상 100 이하입니다.
- numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예
numbers result
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
나의 코드)
function solution(numbers){
let answer= []
for(i=0;i<numbers.length;i++){
for(j=i+1;j<numbers.length;j++){
answer.push(numbers[i]+numbers[j])
}
}return Array.from(new Set(answer)).sort(function(a, b) {
return a - b});
}
나의 풀이)
먼저 answer에 빈 배열을 할당한 다음에, i와 j에 for문을 돌려준다. 이 때 j에는 i+1을 할당해서 같은 numbers[i]+numbers[i]와 같은 불상사가 일어나지 않도록 한다(문제에서 서로 다른 값을 더한다고 함) 빈 배열인 answer에 서로 다른 numbers[i]와 numbers[j]가 더한 값을 밀어 넣고, Array.from(new Set(answer))을 통해 중복을 제거한다. sort(function(a,b){return a-b})를 통해 배열을 오름차순으로 정리한다. 처음에는 sort()값으로만 설정해도 오름차순으로 배열이 되는 줄 알았는데, 안의 값까지 분명히 적어줘야 테스트가 통과되었다. sort()에 대해 자세히 알아보면
let a =[1,345,62,36]
let b= ["민수","정아","지현","가영"]
console.log(a.sort(function(a,b){return a-b})) //오름차순
console.log(a.sort(function(a,b){return b-a})) //내림차순
console.log(a.sort())//원본 그대로 출력됨
console.log(b.sort())//['가영','민수','정아','지현'] 오름차순 배열
console.log(b.sort(function(a,b){return a-b})) //오름차순
console.log(b.sort(function(a,b){return b-a})) //오름차순으로 배열
console.log(b.sort(function(a,b){return a-b}).reverse())//내림차순배열
숫자의 경우 .sort()를 적용했을 때 오름차순으로 정렬되지 않았고, 괄호안의 내용을 입력해줘서 오름차순과 내림차순으로 정렬할 수 있었다. 반면 문자의 경우 .sort()만 적용했을 때 이름이 오름차순으로 배열되었으나 괄호안의 내용은 전혀 먹히지 않았다. 내림차순으로 문자를 배열하려는 경우에는 일단 .sort()를 적용한 다음, reverse()를 다시 한 번 적용해주어야 한다.
'알고리즘' 카테고리의 다른 글
프로그래머스 자바스크립트 알고리즘 스터디[문33~문36] (0) | 2022.03.16 |
---|---|
3월 15일 알고리즘 모의고사 2번 풀이 (0) | 2022.03.15 |
프로그래머스 자바스크립트 알고리즘 스터디[문25~문28] (0) | 2022.03.14 |
프로그래머스 자바스크립트 알고리즘 스터디 [문21~문24] (0) | 2022.03.14 |
프로그래머스 자바스크립트 알고리즘 스터디 [문17~문20] (0) | 2022.03.14 |