고양이와 코딩
[프로그래머스] 2월3일 ~ 2월15일 본문
728x90
2월3일
크기가 작은 부분문자열
내 풀이
function solution(t, p) {
const p_len = p.length;
let count = 0;
let result = [];
for (let i = 0; i <= t.length - p_len; i++){
result.push(t.substring(i, i + p_len));
if(Number(result[i]) <= Number(p)) {
count++;
}
}
return count;
}
2월5일
삼총사
풀이
function solution(number) {
let count = 0;
for (let i = 0; i < number.length; i++){
for(let j = 0; j < number.length; j++){
for(let k = 0; k < number.length; k++){
// 서로 다른 인덱스를 가진 경우에만 계산
if (i !== j && j !== k && i !== k) {
// 합이 0인 경우 answer 증가
if (number[i] + number[j] + number[k] === 0){
count += 1;
}
}
}
}
}
// 중복 순열을 고려하여 각 경우의 수를 6으로 나누어 준다
return count / 6;
}
조합을 사용 해 보려고 했는데 .... 너어무 어려워서 결국 ㅎ ㅎ남의 코드를 봤다!
이해하면 된거 아니겠는가...
i = 0, j = 0, k = 0
i = 0, j = 0, k = 1
i = 0, j = 0, k = 2
i = 0, j = 0, k = 3
i = 0, j = 0, k = 4
i = 0, j = 0, k = 5
i = 0, j = 1, k = 0
i = 0, j = 1, k = 1
i = 0, j = 1, k = 2
i = 0, j = 1, k = 3
i = 0, j = 1, k = 4
i = 0, j = 1, k = 5
for문은 이런식으로 작동하며 조건을 거치면
입력값: [-2, 3, 0, 2, -5]
i : 0, j : 2, k : 3
i : 0, j : 3, k : 2
i : 1, j : 3, k : 4
i : 1, j : 4, k : 3
i : 2, j : 0, k : 3
i : 2, j : 3, k : 0
i : 3, j : 0, k : 2
i : 3, j : 1, k : 4
i : 3, j : 2, k : 0
i : 3, j : 4, k : 1
i : 4, j : 1, k : 3
i : 4, j : 3, k : 1
이렇게 작동한다
2월15일
최소직사각형
가로x세로에 너무 집착하면 머리가 빙빙 돌게된다.
sizes[i][0]과 sizes[i][1]을 비교해서 더 큰 값은 width라고 하고, 작은 값은 height라고 가정하고 풀면 된다 ! (반대로도 가능)
내 풀이
function solution(sizes) {
let width = [];
let height = [];
for (let i = 0; i < sizes.length; i++) {
if (sizes[i][0] < sizes[i][1]) {
width.push(sizes[i][1]);
height.push(sizes[i][0]);
} else {
width.push(sizes[i][0]);
height.push(sizes[i][1]);
}
}
const maxWidth = Math.max(...width);
const maxHeight = Math.max(...height);
return maxWidth * maxHeight;
}
시저 암호
이건,, 잘 모르겠어서 gpt의 도움을 받았다 ㅎㅎ
풀이
function solution(s, n) {
let result = "";
for (let i = 0; i < s.length; i++) {
if (s[i] === " ") {
result += " ";
continue;
}
// 대문자인 경우
if (s[i] >= "A" && s[i] <= "Z") {
result += String.fromCharCode(((s[i].charCodeAt() - 65 + n) % 26) + 65);
}
// 소문자인 경우
else if (s[i] >= "a" && s[i] <= "z") {
result += String.fromCharCode(((s[i].charCodeAt() - 97 + n) % 26) + 97);
}
}
return result;
}
charCodeAt이랑 fromCharCode는 생소했지만, 이름으로 대충 어떤 역할을 하는 메서드인지 파악이 가능하다.
`String.fromCharCode()`는 유니코드 코드 포인트로부터 문자열을 생성하는 메서드인데, 즉 String.fromCharCode(65)는 "A" 를 반환한다.
`charCodeAt()`은 문자열에서 주어진 인덱스에 해당하는 문자의 유니코드 코드 포인트를 반환한다. 즉 "A".charCodeAt()은 65를 반환한다.
위 코드에서는 알파벳을 숫자로 바꾼 다음 다시 문자로 바꾸는데 사용되었다고 이해하면 될 것 같다.
- s[i].charCodeAt() - 65: 문자 s[i]의 ASCII 코드 값에서 대문자 A의 ASCII 코드 값(65)을 뺀 값을 계산합니다. 이를 통해 해당 문자가 알파벳 대문자 중에서 몇 번째 문자인지를 파악
- (s[i].charCodeAt() - 65 + n) % 26: 밀어야 하는 거리 n을 더한 후에 알파벳 길이인 26으로 나누어 줍니다. 이를 통해 알파벳을 한 바퀴 돌게 될 경우를 처리
- String.fromCharCode(...)을 사용하여 유니코드 코드 포인트를 문자로 변환
마지막에 65와 97을 더해주는 이유는 알파벳을 밀 때 대소문자를 구분해서 처리해야 하기 때문이다!
한동안 코테를 안풀었더니 머리가 굳었다악!!!
앞으로 열심히 해야지 ㅎㅎ
'javascript' 카테고리의 다른 글
[프로그래머스] - 3월13일 ~ (0) | 2024.03.14 |
---|---|
[프로그래머스] - 2월26일 ~ (0) | 2024.02.26 |
[리액트를 다루는 기술] data and hash arguments required 에러 해결 (0) | 2024.01.26 |
[프로그래머스] 1월16일 ~ 1월21일 (0) | 2024.01.16 |
[프로그래머스] 1월8일 ~ 1월14일 (1) | 2024.01.08 |