![[프로그래머스 1단계] 문제풀이 #4](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHg5Nc%2FbtsHVTDZm7S%2FnI5fvnwijtUvuckt5L6eL1%2Fimg.png)
1. 같은 숫자는 싫어
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1-1. 내 풀이
filter 를 사용해 index 값을 이용해 결과를 구했다.
function solution(arr) {
return arr.filter((item,index) => item !== arr[index+1])
}
1-2. 다른 사람 풀이
제일 상위에 있는 답이 나랑 똑같다..! 뿌듯하네
function solution(arr)
{
return arr.filter((val,index) => val != arr[index+1]);
}
2. 3진법 뒤집기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2-1. 내 풀이
toString 을 사용하여 3진법으로 바꿔주고 순서를 뒤집기 위해 split 으로 배열을 만들고 뒤집고 다시 문자열로 만들어줬다. 그리고 parseInt 를 사용해서 3진법을 10진법으로 바꿔줬다.
function solution(n) {
return parseInt(n.toString(3).split('').reverse().join(''),3);
}
2-2. 다른 사람 풀이
나랑 같은 방법인데 배열을 만들때 스프레드 연산자를 사용하였다. 이 방법도 배워야겠다.
const solution = (n) => {
return parseInt([...n.toString(3)].reverse().join(""), 3);
}
3. 크기가 작은 부분 문자열
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
3-1. 내 풀이
for 문을 사용해 비교할 숫자를 직접 만들어 비교를 하였다. 좀 비효율적이다
function solution(t, p) {
let result = 0;
for(i = 0; i <= t.length - p.length; i++) {
let num = 0;
for(j = 0; j < p.length; j++) {
num += t[i + j] * 10**(p.length - j - 1);
}
if (num <= p) result +=1;
}
return result;
}
3-2. 다른 사람 풀이
나는 비교할 숫자를 for 문으로 귀찮게 구했는데 slice 가 있었구나.. 앞으로 문자열 자를 때 slice 를 사용해야겠다.
function solution(t, p) {
let count = 0;
for(let i=0; i<=t.length-p.length; i++) {
let value = t.slice(i, i+p.length);
if(+p >= +value) count++;
}
return count;
}
4. 예산
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
4-1. 내 풀이
먼저 오름차순으로 정렬을 하고, 작은 수를 순서대로 예산에 지원하며, 예산보다 지원할 금액이 적은 경우 예산에 추가하고 만약 예산보다 합친 지원 금액이 클 경우 break 를 사용하여 결과를 반환했다.
function solution(d, budget) {
const arr = d.sort((a,b) => a-b);
let result = 0;
let money = 0;
for (const item of arr) {
if (budget >= money) {
money += item;
if (budget < money) break;
result ++;
}
}
return result;
}
4-2. 다른 사람 풀이
현재 예산에서 뺀 금액이 0보다 크면(돈 남음) 1을 반환하여 count 값에 더하는 방식으로 했다. 이렇게 reduce 를 사용할 수 있구나
function solution(d, budget) {
return d.sort((a, b) => a - b).reduce((count, price) => {
return count + ((budget -= price) >= 0);
}, 0);
}
5. 이상한 문자 만들기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
5-1. 내 풀이
단어 별로 구분해 배열을 만들기 위해 split(' ') 를 하였고 짝수는 대문자, 홀수는 소문자로 만들어주고 배열이 된 단어를 합칠 때, 맨 마지막만 공백를 주지 않도록 구현했다.
function solution(s) {
const arr = s.split(' ');
const result = arr.map((word, i)=> {
const newArr = word.split('').map((item,index)=>{
if (index % 2 === 0) {
return item.toUpperCase();
} else {
return item.toLowerCase();
}
})
return newArr.join('') + (i === arr.length -1 ? '' : ' ');
})
return result.join('');
}
5-2. 다른 사람 풀이
나랑 방법은 거의 똑같다
function toWeirdCase(s){
return s.split(' ').map(i => i.split('').map((j, key) => key % 2 === 0 ? j.toUpperCase() : j.toLowerCase()).join('')).join(' ')
}
6. 최소직사각형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
6-1. 내 풀이
배열 내부를 오름차순으로 정렬을 한 후에 각 배열의 인덱스 값을 비교해 큰 값을 찾아 곱했다.
function solution(sizes) {
const arr = sizes.map((size)=>{
return size.sort((a,b) => a - b);
})
let width = arr[0][0];
let height = arr[0][1];
for(i=1;i<arr.length;i++) {
if (arr[i][0] > width) width = arr[i][0]
if (arr[i][1] > height) height = arr[i][1]
}
return width * height;
}
6-2. 다른 사람 풀이
나랑 방법은 똑같지만 디테일한 부분에서 조금 더 효율적이다. [w, h] 이렇게 구조분해 할당을 사용하여 구현하였다.
function solution(sizes) {
const rotated = sizes.map(([w, h]) => w < h ? [h, w] : [w, h]);
let maxSize = [0, 0];
rotated.forEach(([w, h]) => {
if (w > maxSize[0]) maxSize[0] = w;
if (h > maxSize[1]) maxSize[1] = h;
})
return maxSize[0]*maxSize[1];
}
7. 삼총사
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
7-1. 내 풀이
오름차순으로 정렬하고 for문을 사용해 더한 값이 0인 경우 결과에 1을 더했다.
function solution(number) {
const arr = number.sort((a,b) => a-b);
const len = arr.length;
let result = 0;
for(i=0; i<len-2; i++) {
for(j=i+1; j<len-1; j++) {
for (k=j+1; k<len; k++) {
if (arr[i] + arr[j] + arr[k] === 0) result++;
}
}
}
return result;
}
7-2. 다른 사람 풀이
거의 다 for 문을 3개 사용하여 풀었다.
8. 시저 암호
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
8-1. 내 풀이
파이썬으로 푸는 법은 아는데 자바스크립트로 아스키코드로 변환하는 메서드를 몰라 구글링을 통해 알아냈고, 아스키코드도 표를 보면서 대문자와 소문자의 끝이 몇 번인지 확인해서 구현했다. 문자를 아스키코드로 바꾸는건 문자.charCodeAt()
이고 아스키코드를 문자로 바꾸는 건 String.fromCharCode(숫자)
이다.. 외워야지
function solution(s, n) {
const result = s.split('').map((item) => {
let codeNum = item.charCodeAt() + n;
if (codeNum - n === 32) codeNum = 32;
if (codeNum > 90 && codeNum <= 90 + n) codeNum -= 26;
else if (codeNum > 122 && codeNum <= 122 + n) codeNum -= 26;
return String.fromCharCode(codeNum);
})
return result.join('');
}
8-2. 다른 사람 풀이
아스키코드를 사용하지 않고 이런식으로도 풀 수 있구나..
function solution(s, n) {
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
for(var i =0; i <s.length; i++){
var text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
var textArr = upper.includes(text) ? upper : lower;
var index = textArr.indexOf(text)+n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}
9. 가장 가까운 같은 글자
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
9-1. 내 풀이
사실 이 문제를 못 풀어서 살짝 힌트를 봤더니 lastIndexOf 라는 메서드가 있는 걸 알게되어 lastIndexOf 를 사용하여 풀었다. 먼저 찾은 것의 index 는 indexOf 이고, 마지막으로 찾은 것의 index 는 lastIndexOf 이다.
function solution(s) {
const sArr = s.split('');
const result = sArr.map((item, index)=>{
const lastIndex = sArr.slice(0,index).lastIndexOf(item);
return lastIndex === -1 ? -1 : index - lastIndex;
})
return result;
}
9-2. 다른 사람 풀이
문자열 a 를 split('') 를 통해 배열로 만들었는데 스프레드 연산자..계속 까먹는다. 잊지 말아야지. 그리고 문자열도 slice 되는 것도 잊고 있었다...
const solution = (s) =>
[...s].map((char, i) => {
const count = s.slice(0, i).lastIndexOf(char);
return count < 0 ? count : i - count;
});
10. 숫자 문자열과 영단어
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
10-1. 내 풀이
이 문제도 사실 replace 로 풀었는데 테스트 케이스가 실패하는 부분이 있었는데 힌트를 살짝 봐서 replace 메서드 말고 replaceAll 메서드를 알게 되어 이를 사용해서 풀었다. 그러면 첫 번째 인자로 되어 있는 글자를 모두 두 번째 인자에 있는 걸로 바꿔준다.
function solution(s) {
let numbers = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine"
];
for(i=0; i < numbers.length; i++) {
s = s.replaceAll(numbers[i],i);
}
return Number(s);
}
10-2. 다른 사람 풀이
보면서 감탄했다... split() 를 사용해 해당 단어를 기준으로 앞, 뒤 배열이 생기면서 그 단어는 없어지고, join() 을 사용하여 그 사이를 숫자로 이어줬다... 나는 split 을 단순히 순자열을 배열로 만들기, join 은 배열을 문자열로 만들기로만 사용했었는데 이런 유용한 방법이 있다는 것을 다시 새롭게 알게되었다.
function solution(s) {
let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
var answer = s;
for(let i=0; i< numbers.length; i++) {
let arr = answer.split(numbers[i]);
answer = arr.join(i);
}
return Number(answer);
}
'💜 코딩테스트 > 문제풀이' 카테고리의 다른 글
[프로그래머스 알고리즘 고득점 Kit] 문제풀이 - 해시 (0) | 2024.07.19 |
---|---|
[프로그래머스 1단계] 문제풀이 #5 (0) | 2024.06.15 |
[프로그래머스 1단계] 문제풀이 #3 (1) | 2024.06.06 |
[프로그래머스 1단계] 문제풀이 #2 (0) | 2024.05.28 |
[프로그래머스 1단계] 문제풀이 #1 (0) | 2024.04.04 |
FE 개발자가 되고 싶은 짱잼이
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!