오늘 나를 괴롭힐 문제! numbers에서 서로다른 두개수를 뽑아서 모두 더한뒤에, 그걸 겹치는걸 빼기도 해야되고, 오름차순으로 담기도 해야된다. 어떻게 하는게 좋을까
생각해본 순서.
1. 빈배열을 만들어서(answer) 서로다른 두개수를 뽑아서 더한수를 집어넣는다.
(반복이 필요하므로 for문을 이용하자)
2. 오름차순으로 정렬을 한다.
3. 그러면 중복되는 숫자가 서로 붙어있을텐데 이것 역시 for문을 이용하면 제거 할수 있지 않을까.
1. 서로다른 두개수를 뽑아서 더한수를 집어넣기.
1번부터 해보았다. 처음에 만들어본 식.
function solution(numbers) {
var answer = [];
for var j=0; j<numbers.length-1; j+=1;{
for var i=j+1; i<numbers.length; i+=1; {
answer.push(numbers[j]+numbers[i])
}
}
return answer;
}
예를 들어 numbers= [0,1,2,3,4]라고 하면
서로다른 두개의 수를 집어 넣는걸 생각해보면
첫번째. 0과 1을 더한것 0과 2를 더한것 0과 3을 더한것 0과 4를 더한것
두번째. 1과 2를 더한것 1과 3을 더한것 1과 4를 더한것
세번째. 2와 3을 더한것 2와 4를 더한것
네번째. 3과 4를 더한것
각각을 for문을 이용해서 만들고
첫번째=>네번째 로 가는것도 for문을 이용했다.
더하는 두개의 수중 왼쪽것을 j 오른쪽 것을 i라고 생각한다면
첫번째 식은 for (var i=1; i<5; i++) numbers[0]+numbers[i] 가 될테고
여기서 j가 0부터 3까지 가면 되는거고 i는 j에 맞추어 1씩커지면되니까 i=j+1로 적었다.
코딩을 내가 잘하지를 않으니까 설명도 잘 못하겠네.
그리고 역시.. 반환된 오류..
vm.js:6
for var j=0; j<numbers.length-1; j+=1;{
^^^
SyntaxError: Unexpected token 'var'
at new Script (vm.js:88:7)
at NodeVM.run (/usr/local/node-v12.18.3-linux-x64/lib/node_modules/vm2/lib/main.js:1108:13)
at Object.<anonymous> (/solution.js:12:23)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at Object.<anonymous> (/solution_test.js:5:13)
뭐가 문제일까 하고 찾아보니
애초에 for문의 형식을 잘못기입했다. 괄호도 빠지고 맨뒤에 ;도 없어야한다. 형식만 맞춰서 수정한뒤에 다시 진행.
function solution(numbers) {
var answer = [];
for (var j=0; j<numbers.length-1; j+=1){
for (var i=j+1; i<numbers.length; i+=1) {
answer.push(numbers[j]+numbers[i])
}
}
return answer;
}
for문 고쳐봄.
테스트 1 | |
입력값 〉 | [2, 1, 3, 4, 1] |
기댓값 〉 | [2, 3, 4, 5, 6, 7] |
실행 결과 〉 | 실행한 결괏값 [3,5,6,3,4,5,2,7,4,5]이(가) 기댓값 [2,3,4,5,6,7]와(과) 다릅니다. |
테스트 2 | |
입력값 〉 | [5, 0, 2, 7] |
기댓값 〉 | [2, 5, 7, 9, 12] |
실행 결과 〉 | 실행한 결괏값 [5,7,12,2,7,9]이(가) 기댓값 [2,5,7,9,12]와(과) 다릅니다. |
오호.. 그래도 결과값이 생각한대로 나온것 같다.
2. 오름차순으로 정렬하기
if문을 이용해서 앞뒤를 비교해서 앞이 더 크면 좌우를 바꾸는식으로 더이상 바뀌는게 없을때까지 무한반복 하면 되지않을까(근데 numbers의 값이 커지면 되게 비효율적일것 같긴하다.) 무한반복은 while을 이용해보려고한다.
일단 생각대로 코딩해보고 검색해보기로..
for (var k=0; k<numbers.length-1; k+=1){
if (numbers[k]>numbers[k+1]){
var c = numbers[k+1]
numbers[k+1]= numbers[k]
numbers[k] = c
}
else {}
}
아. 근데 저 for문에 while을 덮어 쓰려니까 while 조건을 true로 하자니 무한으로 반복될테고.. 완성되었다는것을 나타낼수 있어야하는데 그걸 코드로 표현하기가 어려운것같다. 그래서 다른방법을.. 서치해 보았다.
아.. 배열에는 sort라는 메소드가 있었다.
그렇다면 answer.sort()를 하면될듯.
function solution(numbers) {
var answer = [];
for (var j=0; j<numbers.length-1; j+=1){
for (var i=j+1; i<numbers.length; i+=1) {
answer.push(numbers[j]+numbers[i])
}
}
answer.sort()
return answer;
}
테스트 1 | |
입력값 〉 | [2, 1, 3, 4, 1] |
기댓값 〉 | [2, 3, 4, 5, 6, 7] |
실행 결과 〉 | 실행한 결괏값 [2,3,3,4,4,5,5,5,6,7]이(가) 기댓값 [2,3,4,5,6,7]와(과) 다릅니다. |
테스트 2 | |
입력값 〉 | [5, 0, 2, 7] |
기댓값 〉 | [2, 5, 7, 9, 12] |
실행 결과 〉 | 실행한 결괏값 [12,2,5,7,7,9]이(가) 기댓값 [2,5,7,9,12]와(과) 다릅니다. |
앗.. 그런데 12가 2보다 앞으로 가있다. 정렬방법이 뭔가 잘못된듯..
서치결과 sort 메소드의 괄호를 비워두면 유니코드 순서대로 정렬이 되고
sort의 괄호에는 compare Function이라는 함수가 들어간다고 한다.
이것의 작동원리는?
이 함수는 a와 b 두개의 배열 element를 파라미터로 받는데,
이 함수가 리턴하는 값이 0보다 작으면 a가 b 앞에오고
리턴하는값이 0보다 크다면 b가 a보다 앞에오도록 하고,
만약 0을 리턴하면 a와 b의 순서를 변경하지 않는다고 한다. 그렇게 해서 싹 한바퀴 도나보다.
그렇다면 sort 내부에 함수를 넣어서 오름차순이 되도록 정리를 해야하는데.
function solution(numbers) {
var answer = [];
for (var j=0; j<numbers.length-1; j+=1){
for (var i=j+1; i<numbers.length; i+=1) {
answer.push(numbers[j]+numbers[i])
}
}
answer.sort(function(a,b){
if(a > b) return +1;
if(a === b) return 0;
if(a < b) return -1;
});
return answer;
}
이렇게 하니까 해결된듯! 다음단계로 고고
3. 중복되는 숫자 제거 하기.
일단 오름차순이 되있으니까 for 문을 이용해서 앞뒤로 비교를 해서, 같은게 하나 있으면 배열에서 splice를 이용해서 한개를 빼버리면 될거같다.
for (var i=0;i<answer.length-1; i+=1){
if (answer[i]===answer[i+1]) {
answer.splice(i,1);
}
}
이런식으로 반복문을 돌리면 되지않을려나 싶어서 돌려봤는데 웬걸..
테스트 1 | |
입력값 〉 | [2, 1, 3, 4, 1] |
기댓값 〉 | [2, 3, 4, 5, 6, 7] |
실행 결과 〉 | 실행한 결괏값 [2,3,4,5,5,6,7]이(가) 기댓값 [2,3,4,5,6,7]와(과) 다릅니다. |
테스트 2 | |
입력값 〉 | [5, 0, 2, 7] |
기댓값 〉 | [2, 5, 7, 9, 12] |
실행 결과 〉 | 테스트를 통과하였습니다. |
두개중 하나만 통과했다.. 테스트 1이 안된이유가 무엇이었을까 생각해본다.
음 일단 splice로 answer를 짤라버리면 인덱스가 앞으로 한칸씩 땅겨지면서 for문의 덫을 피하는 element가 생기는것 같다. 짤리면 같은위치로 또 돌려야되는데 다음으로 넘어가버리는게 문제구만. 하.. 어떻게할까 고민하다가 그럼 한번 더 돌려보면 괜찮지않을까 싶어서 for문을 한번 더 돌리는걸로 script를 짜보았다. 일단은 넘어가기만 해보자는 심정으로..
function solution(numbers) {
var answer = [];
for (var j=0; j<numbers.length-1; j+=1){
for (var i=j+1; i<numbers.length; i+=1) {
answer.push(numbers[j]+numbers[i])
}
}
answer.sort(function(a,b){
if(a > b) return +1;
if(a === b) return 0;
if(a < b) return -1;
});
const c = answer.length
for (var i=0;i<c-1; i+=1){
if (answer[i]===answer[i+1]) {
answer.splice(i,1);
}
}
for (var i=0;i<c-1; i+=1){
if (answer[i]===answer[i+1]) {
answer.splice(i,1);
}
}
return answer;
}
최종본.. 마지막에 for문을 여러번 돌리는거가 좀 찜찜하긴하지만 일단 예제 2개는 통과함으로 나온다.
프로그래머스 사이트에서 이렇게 코드짜는게 통과하게되면 다른사람의 풀이도 볼수 있게 되는데 거기서 영감을 얻어보아야겠다.
일단 두번째문제도 어떻게든 뿌셧다!
'실전, 제태크! > 웹개발, 어플개발로 돈벌기' 카테고리의 다른 글
[챌린지세번째] 자바스크립트 코딩테스트 뿌시기 (문자열 내 p와 y의 개수) (0) | 2021.03.24 |
---|---|
[챌린지첫번째] 자바스크립트 코딩테스트 뿌시기 (가운데 글자 가져오기) (0) | 2021.03.21 |
자바스크립트 undefined vs null 관련자료 스크래핑 (0) | 2020.10.16 |
웹개발의 시작! (0) | 2020.09.02 |