그저 내가 되었고

항해99) 2주차:: 알고리즘 테스트 연습(15~28); How I solved + more 본문

개발/항해99 9기

항해99) 2주차:: 알고리즘 테스트 연습(15~28); How I solved + more

hyuunii 2022. 9. 26. 20:01

🎈 Today's my BEST

15. 내적

How I solved👇🏻

function solution(a, b) {
    let sum = 0;
    for ( i = 0 ; i < a.length ; i++ ) {
        sum += (a[i] * b[i])
    }
    return sum
}

▶앞선 1~14번 문제 풀면서 삽질 맘껏 하니까.. 변수를 어디에다가 어떻게 선언하는지 꽤 익숙해져서 꽤 쉽게 풀었음.

 

 

16. 문자열 내 p와 y의 개수

How I solved👇🏻

function solution(s){
    let convert = s.toLowerCase();
    var count1 = (convert.match(/p/g) || []).length;
    var count2 = (convert.match(/y/g) || []).length;
    
    if (count1 == count2) {
        return true
    } {return false}
}

▶이건.. 문자열의 갯수 구해주는걸 따로 뭐 for문 돌리기 싫어서 그냥 함수 찾아보고 함.... 바로 구해주는 함수는 없고 저렇게 정규식으로 구한다고 함.

 

 

17. 문자열 다루기 기본

How I solved👇🏻

function solution(s) {
    let len = s.length;
    if (len !== 4 && len !== 6) {
    return false
  } else {
    for ( let i = 0 ; i < len ; i++) {
      if (isNaN(s[i])) return false;
    }
    return true;
  }
}

▶거의 한시간을 넘게 헤맸다.... 아니 일단 처음부터 if문 안에 for문 쓰기, 중첩 if문, if문 안에 for문 안에 if문 등등 다 짜증났는데...... 식 거의 다 세우고도 len !== 4 || 6 이러면 틀린다는 게 진짜 진짜 진짜 개ㅐㅐㅐ 킹받는 부분이었다..........(문법 모름)

 

Model Answer👇🏻

function solution(s) {
    if (s.length === 4 || s.length === 6) {
        return s.split("").every(c => !isNaN(c))
    } 
    else {
        return false
    }
}

▶Array의 every 메소드를 사용하여 해당 문자열을 일일이 isNaN인지 확인할 수 있음. every는 배열 안의 모든 요소가 주어진 판별함수를 통과하는지에 따라 boolean값을 도출함. 조건을 만족하면 true, 아니면 자동으로 false 뱉음. 글서 if 필요 없다~!(그래서 이중 if문 안쓰고 바로 return 쓸 수 있는 것) 

▶for문 돌려서 요소 하나하나 isNaN은 왜 안되는건지 아직도 의문. 똑같지 않나? 하.....ㅎㅅㅎ

 

Study More👇🏻

Array.prototype.every()

 

 

18. 서울에서 김서방 찾기

How I solved👇🏻

function solution(seoul) {
    let location = seoul.indexOf("Kim")
    return "김서방은 " + location + "에 있다"
}

▶location을 따로 변수로 빼지 않아도 되지만.. 이게 훨씬 더 깔끔하다고 생각.

 

 

19. 수박수박수박수박수박수?⭐

How I solved👇🏻

//짝수 자리에 "박", 홀수 자리에 "수" 밀어 넣는 방법.

function solution(n) {
    let waterMelon = '';
   
    for ( let i = 0 ; i < n ; i++) {
        if( i === 0 || i % 2 === 0) {
            waterMelon += "수"
        } else {waterMelon += "박"
        }
    }
        return waterMelon
}


//글자 수 홀/짝에 따라 "수박" repeat을 달리 처리하는 방법
function solution(n) {
    let str = "수박";
    let answer = '';
    
    if ( n % 2 === 0 ) {
        answer += str.repeat(parseInt(n / 2));
    } else {
        answer += str.repeat(parseInt(n / 2)) + "수";
    }
    return answer
}

▶처음에는 indexOf로 각각의 자릿수 다 계산해서 값을 밀어 넣어야 하나..? 하고 생각했는데 아무리 return을 해도, 그냥 집어넣으려 해도 그렇게는 안돼서 노선 변경........

 

 

20. 완주하지 못한 선수

Model Answer👇🏻

function solution(participant, completion) {
    participant.sort();
    completion.sort();

    for ( i = 0 ; i < participant.length ; i++ ) {
     if (participant[i] != completion[i]) {
         return participant[i]
     }   
    }
}

▶풀지 못했다!!!!! 으앙!!!!!!! 답을 찾아보니 아이디어가 진짜 신박하고, 신기하고, 너무 재밌다고 생각됨ㅋㅋㅋㅋ 내장 함수, 메쏘드 등등을 전혀 이용하지 않는다면? sort의 존재를 모른다면? 아마 풀지 못할 것 같다.

 

 

21. 이상한 문자 만들기

Model Answer👇🏻

function solution(s) {
    let words = s.split(' ');
    let answer = '';
 
    for (let i = 0 ; i < words.length ; i++) {
        for(let j = 0 ; j < words[i].length ; j++) {
            if(j % 2 === 0 || j === 0) {
                answer += words[i][j].toUpperCase();
            } else {
                answer += words[i][j].toLowerCase();
            }
        }
        if (i < words.length - 1) {
            answer += ' ';
        }
    }
    return answer;
}

➟ 공백 기준으로 잘라서 문자열 덩어리들로 만들고

➟ 그 문자열들 총 갯수만큼 for문 돌건데

➟ 먼저 위의 for문 안에서, 그 문자열들 중 첫 번째 문자열의 문자 갯수만큼 for문 돌려줄거임

➟ 0번째 혹은 짝수번째면 대문자로 바꾸고

➟ 그게 아니라면 소문자로 바꿈. 위 두 과정 중 한 과정이 한 번에 일어남. if 또는 else 중 한개가 한번에 일어나는거고, i나 j는 차례로 증가하기 때문에 그냥 +=를 해줘도 아무 문제가 없는 것 

➟ j 하나가 다 돌면 위의 for문으로 빠져나와서 i의 for문을 통해 공백을 적어줌

➟ 그 후 다시 안쪽 for문 돈다.

 

function solution(s) {
    let words = s.split( " " );
    let allWords = words.map(x => x.toLowerCase());
    let temp = '';

    for ( let i = 0 ; i < allWords.length ; i++) {
        for ( let j = 0 ; j < allWords[i].length ; j++ ) {
            if ( j == 0 || j % 2 == 0 ) {
               temp += allWords[i][j].toUpperCase();
            } else {
                temp += allWords[i][j]
            }
        }
      if (i < allWords.length - 1) {
          temp += ' ';
      }
    }
     return temp;
}

처음부터 전부 소문자로 바꾸고 시작할 수도 있음

 

 

22. 자릿수 더하기

How I solved👇🏻

function solution(n) {
    let letters = n.toString();
    let sum = 0;
    for ( let i = 0 ; i < letters.length ; i++ ) {
        sum += letters[i]*1
    }
    return sum
}

▶숫자를 문자열로 치환하는 방법을 헷갈리지 말자. 마음대로 하지 말자!!!!!!(처음에 let letters = "n"; 이렇게 함...ㅋㅋ....)

 

 

23. 자연수 뒤집어 배열로 만들기

How I solved👇🏻

function solution(n) {
    let temp = [];
    let letters = n.toString();
    for (let i = 0 ; i < letters.length ; i++) {
        temp.push(letters[i]*1)
    }
    return temp.reverse();
}

▶마지막에는 그냥 reverse 썼다.... 아 귀차너....ㅋㅋㅋㅋ큐큐ㅠㅠ

 

 

24. 정수 내림차순으로 배치하기

How I solved👇🏻

function solution(n) {
    let letters = n.toString();
    let temp = [];
    
    for (let i = 0 ; i < letters.length ; i++) {
    temp.push(letters[i]);
    }
    
    let answer = temp.sort(function(a, b)  {
                    return b - a;
                 });
    
    return answer.join('')*1
}

▶막... 문자열로 바꾸고 배열 만든 후에 for문 돌려서 배열에 하나하나 집어넣고...(하나하나 쪼개려고) 그다음에 sort 해줬는데.... 띠용

 

Model Answer👇🏻

function solution(n) {
    let answer = Number(n.toString().split("").sort((a,b) => b - a).join(''));
    return answer;

▶그냥 split("") 하면 알아서.. 그냥 각각 쪼개지나봄..... 와우......? 그 후엔 문자열도 그냥 sort 해버리면 되니까..... 응

▶아예 빠져나오기 전에 number만 씌워주면 끗...

 

Study More👇🏻

▶아래의 세 개 메쏘드 모두 string의 것

* .join('')

* split("")

* sort((a, b) => b - a)

 

 

25. 정수 제곱근 판별

How I solved👇🏻

function solution(n) {
    let answer = 0;
    let power = 0;
    
    for(let i=1; i*i<=n; i++){
      if(i*i == n){
        answer = i + 1
        power = answer*answer
       } else if(power == 0) {
        power = -1
      }
    }
 return power ;
}

▶어어... 이거 좀.... 이상한데...... 아니...... 왜 굳이 answer하고 power을 각각 만들어야하지?! 이런게 제일 문제임. 변수를 언제 잡는지 어떻게 잡는지 그런거......T T 기본이 제일 중요하다!!!!!!!!!!!!

 

function solution(n) {
    if (Number.isInteger(Math.sqrt(n))) {
        return (parseInt((Math.sqrt(n)) + 1)  ** 2);
    } else {
        return -1
    }
}

▶다시 풀 때는 그냥 square root 이용해서 풀었음. 간단하게 잘풀림.

 

 

26. 제일 작은 수 제거하기⭐겨 우 이 해 함

✍🏻문제 설명

▶정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

🎯제한 조건
  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 

Model Answer👇🏻

▶이제 이해함........... 이게 뭐냐면............ arr.splice(i, 1)이 arr의 i번째부터 1개를 컷해준다는건데.............. 위에서 for문 돌면서 i=j;로 제일 작은 숫자를 찍어주는 것임. 그러니까..... arr[i] > arr[j]일 때만 j를 i에 재할당해주고, 그게 아니라면 그냥 아무 일도 일어나지 않음. i와 j의 재할당으로 app.splice(i, 1)이 제일 작은 수를 컷팅할 수 있게 되는 것.....!!!!!

function solution(arr) {
    if (arr.length === 1) return [-1];
    
    let i = 0;
    for (let j = 0; j < arr.length; j++) {
        if (arr[i] > arr[j]) i = j;
    }
    arr.splice(i, 1);
    return arr;
}

 

 

27. 콜라츠 추측

How I solved👇🏻

function solution(num) {
    var answer = 0;
    
    for ( let i = 0 ; i < 500 ; i++) {
        if (num !== 1) {
            if (num % 2 === 0) {
                num = num / 2;
            } else {
            	num = (num * 3) + 1;
            }
        } else {
            return answer = i;
        }
    }
    return answer = -1;
}
function solution(num) {    
    for ( let i = 0 ; i < 500 ; i ++ ) {
        if ( num !== 1 ) { 
            if ( num % 2 === 0 ) {
                num = num / 2;
            } else {
                num = (num * 3) + 1;
            }
        } else {
            return i
        }
    }
    return -1;
}

 

 

28. 하샤드 수

How I Solved👇🏻

function solution(x) {
    let arr = x.toString().split("").map(x => parseInt(x));
    let sum = arr.reduce((acc, cur) => acc + cur, 0);

    return ( x % sum === 0 ) ? true : false
}

 

Model Answer👇🏻

function solution(x) {
    let sum = 0;
    let letters = x.toString().split("");
    
    for ( let i = 0 ; i < letters.length ; i++) {
        sum += letters[i]*1
    }
    return (x % sum == 0) ? true : false 
}