22.9.24

커피 내리는 그냥 사람·2022년 9월 24일
0

항해99

목록 보기
14/108

마라톤 13~28

구글 검색으로 메소드 찾아서 많이 풀어봤다. 검색하며 메소드 사용법도 익히고 좋았다. 쉽지 않다..

13. 2016년

function solution(a, b) {
    var answer = '';
    let days = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
    // 먼저 요일 설정. 이미 주어진 것이므로 배열화 시킴
    answer = days[new Date(`2016-${a}-${b}`).getDay()]
  // Date() 함수와 getDay() 메소드 이용. ``기호로 변수 a, b 집어 넣음
    return answer;
}

14. 나누어 떨어지는 숫자 배열

3시간 가까이 고민했으나 정답 근처까지만 갔을 뿐..

고민한 사항 : 왜 첫 케이스에서 -1이 나올까? -> answer=[-1]로 줬기 때문일까? 하지만 이걸 해결하지 못해 결국 답안을 체크했다.

function solution(arr, divisor) {
    var answer = [];
    for (let i = 0; i < arr.length; i++) {
        if(arr[i] % divisor === 0) {
            answer.push(arr[i])
        }
      // divisor로 나눴을 때 나머지가 0이면 푸쉬. 이거까진 했다.

    }
        if(answer.length == 0) {
      answer.push(-1);
    }
  // 단순했다. 그냥 길이가 0이면 -1을 넣어주기만 했음 됐다...
    answer.sort((a, b) => a-b)
    return answer;
// sort도 한참 고민했는데 그냥 화살표함수 써서 했음 됐다.
}

15. 내적

음양더하기에 array끼리 곱해서 합하는 것 활용하여 바로 풀었음

function solution(a, b) {
    var answer = 0;
    // answer 초기화
    for (let i = 0; i < a.length; i++){
      // a, b가 length가 같다는 전제
        answer += a[i] * b[i]
      // array끼리 곱해서 더하기
    }
    
    return answer;
}

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

function solution(s){
    var answer = true;
    let countP = 0
    let countY = 0
    // p, y를 셈하는 변수 설정
    let arrayS = s.toLowerCase().split("")
    // 대소문자 상관없이 검색되기 위해 소문자로 모두 변경->이후 문자열을 배열로 바꿈
    for (let i = 0; i < arrayS.length; i++){
        if (arrayS[i] === "p") {
            countP += 1
        }
        if (arrayS[i] === "y") {
            countY += 1
        }
      // p, y를 카운트하면 변수가 올라감
        if (countP === countY) {
            answer = true
        }else{
            answer = false
        }
      // 문제 조건에 맞게 true, false 지정
    }
    return answer;
}

17. 문자열 다루기 기본

시도해본 것 : isNaN, parseInt, for & array, regex...

2시간 넘게 해답이 안 나오고 답답해서 답을 찾아보기로 했다.

문제는 e라는 녀석에 있었다. 그리고 4자리, 6자리 고려 안 했다...


function solution(s) {

    if(s.length === 4 || s.length === 6){
        return s.split("").every(c => !isNaN(c))
        //이유는 자바스크립트에서는 숫자에 e가 붙으면 지수로 인식하여 문자인 경우도 그냥 숫자로 인식해버린다는 것.
        // 모든 요소가 number이면 true리턴
    } else {
        return false;
    }
}

참고 블로그

18. 서울에서 김서방 찾기

다 찾고 오탈자에서 멘붕할 뻔했다. 문제를 잘 읽자.

function solution(seoul) {
    var answer = '';
    for(let i = 0; i < seoul.length; i++){
      // for문으로 먼저 배열 돌리기
        if(seoul[i] === "Kim"){
          // "Kim" 서방이면
            answer = `김서방은 ${i}에 있다`
            // `` 기호 사용해서 답안 만들기. 따로 인덱스 찾을 필요 없다.
        }
    }
    return answer;
}

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

array까지 생각했고 별의 별 시도를 다 했는데 답은 간단했다. +=였다. 문자열 합하기 join만 있는게 아니다.

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

정말 간단하게 생각하자. 정말로 간단히.

20. 완주하지 못한 선수

2시간 넘게 헤매다 결국 답 봤다. 생각보다 되게 단순하고 예전에 봤던 모습이었다.

function solution(participant, completion) {
    var answer = '';
    
    let noDup = [participant.filter(x => !completion.includes(x))]
        console.log(noDup)
    
    let dup = participant.filter(item => completion.includes(item))
    console.log(dup)
    
    let dupResult = dup => dup.filter((item, index) => dup.indexOf(item) !== index)
    console.log(dupResult(dup))
    
    if(noDup) {
    answer = noDup.join("")     
    }else{
    answer = dupResult(dup).join("")
    }
    return answer;
    }
    

내가 접근한 방법 : 각종 필터, 인덱스 활용, 해봤지만 한 케이스에서 계속 막힘

참고한 답안

function solution(participant, completion) {
    participant.sort(); //참가자 배열 정렬
    completion.sort(); //완주자 배열 정렬
    for(var i=0;i<participant.length;i++){
        if(participant[i] !== completion[i]){
            //인덱스 0부터 순차적으로 두 배열 비교
            return participant[i];
            //비완주자가 참가자 배열에 나올 경우 출력
        }
    }
}

그냥 순서만 맞춰서 짝맞추기 하면 됐다...

21. 이상한 문자 만들기

시도했지만 대차게 깨진(케이스에서) 내 풀이

function solution(s) {
    var answer = '';
    let newS = [...s]
    let temp = []
    for (let i = 0; i < newS.length; i++){
        if(i % 2 === 0) {
            let bigWords = newS[i].toUpperCase()
            temp.push(bigWords)
            }else{
            let smallWords = newS[i].toLowerCase()
                temp.push(smallWords)
            }
        answer = temp.join("")
    }
    return answer;
}

답 찾아보니 그렇게 어려운 내용은 아니었다. 반복학습이 필요할 듯.. 2시간 왜 뻘짓 했는지.. 리스트에 3중 for문까지 별 짓 다 했는데..

function solution(s) {
    let answer = '';
    let words = s.split(' ');
    
    for (let i = 0; i < words.length; i++) {
        for(let j = 0; j < words[i].length; j++) {
            // 이중 for문까지는 구현한 사항 차이가 있다면
            if(j % 2 === 0) {
                answer += words[i][j].toUpperCase();
                // 인덱스 값으로 해서 바로 answer에 더하는 것이 차이점
            } else {
                answer += words[i][j].toLowerCase();
            }
        }
        if (i < words.length -1) {
            // 여기는 몰랐던 부분. 공백 추가.
            //단어 사이의 공백은 words의 길이를 활용한다. try hello world의 길이는 3이므로 1을 빼준 2보다 작을 때 공백을 넣어준다. 결국 2보다 작은 0번째인 try 뒤와 1번째인 hello뒤에 공백이 추가된다.
            answer += ' ';
        }
    }
    return answer;
}

22. 자릿수 더하기

python 같은 경우는 sum을 쓰면 금방이지만 js는 좀 다양한 방법을 사용했다.

function solution(n)
{
    var answer = 0;
    let arrayN = Array.from(String(n), Number)
    // 먼저 배열로 변경
    answer = arrayN.reduce((a, b) => a+b, 0)
  // reduce 메소드를 사용하여 합산
    
    return answer;
}

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

위의 문제 + python에서 쓰던 reverse() 활용

function solution(n) {
    var answer = [];
    let arrayN = Array.from(String(n), Number).reverse()
    answer = arrayN
    return answer;
}

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

마찬가지로 22번의 응용. 마지막에 number로 array에서 바꾸는거가 좀 헷갈렸다.

function solution(n) {
    var answer = 0;
    let arrayN = Array.from(String(n), Number).sort(function(a, b)
                                                    {return b-a})
    // sort와 함수를 활용한 내림차순 배치 방법
    answer = Number(arrayN.join(''))
    return answer;
}

25. 정수 제곱근 판별

새로운 개념을 배웠다. isInteger, Math.sqrt

function solution(n) {
    var answer = 0;
    let newNumber = Math.sqrt(n)
    // Math.sqrt로 제곱근 구함
    if (Number.isInteger(newNumber)){
      // Number.isInteger로 정수 판단
        answer = (newNumber+1) * (newNumber+1)
    }else{
        answer = -1
      // 아니면 -1
    }
    return answer;
}

26. 제일 작은 수 제거하기

filter + 화살표 함수 자주 나온다. 눈에 익혀두자

function solution(arr) {
    var answer = [];
    
    if(arr.length === 1){
        answer = [-1]
      // length가 1이면 [-1]로 반환
    }else{
        let min = arr.reduce((prev, curr) => {return prev > curr ? curr:prev})
        // reduce로 최소값 구하기
        
        answer = arr.filter((element)=>element !==min)
      
      //min 빼고 다 필터링해서 가져온다.
        
            }
        return answer;
        }

27. 콜라츠 추측

파이썬 while문이 떠올라서 다행히 풀었다.

    // 스케치 => while문 활용하여 문제 풀이
    // if % 2 === 0 -> /2
    // if %2 === 1 -> *3 +1
    // if 1 -> return 까지의 n번(count += 1)
    // n===500 -> return -1

function solution(num) {
    var answer = 0;
    
    while (num != 1) {
        if(num % 2 === 0) {
        num = num / 2
        answer += 1
            // 각 조건들 하고 answer +=1
            if(answer === 500){
                answer = -1
                // answer이 500이 되면 스톱하고 -1로 전환
                break
            }
    }else if (num % 2 === 1){
        num = num * 3 + 1
        answer += 1
        // 각 조건들 하고 answer +=1
            if(answer === 500){
                answer = -1
                break
    }
    }else if (num === 1) {
        return answer
    }   
    }
    
    return answer;
}

28. 하샤드 수

22번 덕에 효과를 봤다.

function solution(x) {
    var answer = true;
    let arrayX = Array.from(String(x), Number)
    // 먼저 array화로 [1, 0] 식으로 만듦
    let sumX = arrayX.reduce((a, b) => a+b, 0)
    // 이후 합산을 reduce로 함. 22번 자릿수 더하기 참고
    
    if (x % sumX === 0) {
        answer = true;
    }else{
        answer = false
    }
    // 이후 조건에 맞게 true, false 먹이기

    return answer;
}

28번까지 중하 문제 끝.

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글