정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
function solution(numbers) {
let arr = []
for (let i = 0; i < numbers.length - 1; i++) {
for (let j = i + 1; j < numbers.length; j++) {
arr.push(numbers[i] + numbers[j])
}
}
let result = Array.from(new Set(arr.sort((a,b)=>a-b)));
return result;
}
반복문을 사용해서 모든 숫자끼리 더한 값을 넣은 배열을 만들고, sort를 사용해 크기 순으로 정렬한 뒤 중복 값을 없애기 위해 new Set을 사용한 후 다시 배열로 만들어 return 했다.
(240502에 적지 못한 부분을 금일 작성한다.)
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
function solution(s, n) {
let str = '';
for (let i = 97; i <= 122; i++) {
str += String.fromCharCode(i);
}
let arr = s.split("");
let result = arr.map((item) => {
let newItem = item.toLowerCase()
let strIndex = str.indexOf(newItem);
if (strIndex + n >= str.length) {
let strSubstr = str.slice(strIndex, str.length);
str = strSubstr + str;
strIndex = str.indexOf(newItem);
}
if (item === " ") {
return item;
} else if (newItem === item) {
return str[strIndex + n]
} else {
return str[strIndex + n].toUpperCase()
}
}).join("")
return result;
}
고뇌의 흔적이 묻은 코드... 분명 코드 실행 때는 성공하는데, 제출 후 채점을 하려고 하면 미칠듯한 실패의 향연으로 절망에 빠졌다.
사실 테스트 케이스에서 어떤 문제가 있는지, 무슨 문제였는지 알면 좋을텐데, 그걸 알 수 없는게 프로그래머스 코딩 테스트의 아쉬운 점인 것 같다.
일단 str에 a부터 z까지 넣어준 다음, 반복문을 사용해 배열로 만든 알파벳 요소들을 하나하나 잘라서 n만큼 뒤의 알파벳을 가져온다. z가 넘어가면 해당 요소만큼 앞에 붙여줘서 a부터 다시 시작할 수 있도록 했고, 빈 배열일 경우 빈 그대로 나오도록 했다. 대소문자 구분도 넣었다.
분명 잘 했다고 생각했고 왜 틀렸는지는 아직도 잘은 모르겠다... (혹시 아시겠으면 댓글로 알려주시면 감사드리겠습니다!)
테스트 케이스에서 3, 5, 9, 13 케이스 제외하고는 전부 실패했다.
여러 고민을 하며 구글링을 하다가, 그냥 좀 더 단순하게 생각해보기로 했다. 사실 어느 정도 다른 코드에서 영감을 받아 작성한 코드이다.
function solution(s, n) {
let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
let lower = "abcdefghijklmnopqrstuvwxyz";
let result = '';
for (let i = 0; i < s.length; i++) {
let el = s[i];
if (el === " ") {
result += el;
continue;
}
let elArr = upper.includes(el) ? upper : lower;
let elNext = elArr.indexOf(el) + n
if (elNext >= elArr.length) {
elNext -= elArr.length;
}
result += elArr[elNext];
}
return result;
}
기존 내 코드에서 변경된 제일 큰 부분은 우선 대소문자 구분을 좀 더 쉽게 삼항 연산자를 통해 해줬고, z가 넘어가는 경우에도 단순하게 해줬다. 굳이 fromcharCode() 메서드를 이용하지 않고도 코드를 짰다.
이 코드가 애초부터 좀 더 잘 짠 코드라고 생각은 하지만, 기존 내 코드에서 어디가 잘못되었는지 알기 힘들었다는 점은 좀 아쉬운 점이다.