[TIL] d+8

river·2022년 3월 14일
0

CS 스터디

오늘부터는 6주간 CS 스터디도 함께 진행된다.
배송된 책 CODE를 읽고 챕터별로 발표하며 공부하는 스터디 ㅇ.ㅇ!
우리 조는 공식 일정이 종료된 뒤, 오후 9시에 모이기로 했다.
2 챕터 정도 읽었는데 나름대로의 유머도 있고 소소하게 흥미로운 내용들이 꽤 있다 ㅋㅋㅋ

알고리즘 스터디

알고리즘 스터디는 이번 주부터 다른 조원들이 이 문제를 풀지 못했음을 가정하고 좀 더 심도 있게 짜놓은 코드에 대해 설명을 해주는 식으로 진행해 보기로 했다.

지난주의 스터디는 그냥 어떤 식으로 풀었는지만 대강 설명하고, 다른 조원과 코드를 비교해 보는 정도로 그쳤는데, 며칠 진행해 보니 스터디의 의미가 조금 부족한 것 같고, 조원 간에 좀 더 화기애애한? 분위기를 가지고 싶어 제안했다!

겸사겸사 지난번에 바로 해결하지 못했던 행렬의 덧셈 문제 풀이 발표를 바로 진행!
처참한 발표의 흔적...

하는 김에 2016년 문제도 같이 진행했는데, 나는 정말 무언가에 대해 조리 있게 설명하는 걸 못 하는구나 싶었다... ^^ㅋ 중간중간 실수도 많았는데 괜찮다며 잘 들어준 조원분들께 무한한 감사의 인사...............

좋았던 점은 내가 써놓고도 헷갈려서 찬찬히 따라가며 읽어야 하는 코드를 한 줄 한 줄, 순서대로 내려갔다가 다시 거슬러 올라가듯 분석해가며 설명하니 구성에 대해 좀 더 이해하기가 쉬워졌다는 것이다.

문제 풀이

2016년

function solution(a, b) {
    let answer = -1;    
    let month = [31,29,31,30,31,30,31,31,30,31,30,31]
    let week = ['FRI','SAT','SUN','MON','TUE','WED','THU']

    for(let i = 0; i < a-1; i++) {    
        answer += month[i]
    }
    
    answer += b
    let day = answer % 7
    return week[day];
    }

2016년의 1월 1일은 금요일이라는 단서를 이용해 1/1 - a/b 사이의 일수를 구해서 요일을 추정하면 된다.

  1. 1월부터 12월까지의 모든 일수(윤년이라는 제한조건이 있기 때문에 2월은 29일로 적는다.)를 담은 month 배열과, 금요일부터 시작되는 요일의 배열을 만들어주고, 반복문을 돌려 1월부터 a-1월까지의 모든 일수를 차곡차곡 더해 구한다.

  2. 1월부터 a-1월까지 일수의 합이 담긴 answer에 b일을 다시 더해주고, 이를 7로 나누었을 때의 나머지를 인덱스로 이용해 week 배열 속에서 맞는 번호의 요일을 꺼내 출력한다.

function solution(arr, divisor) {
    var answer = [];
    
    for (let i = 0; i<arr.length; i++) {
        if(arr[i]%divisor == 0) {
            answer.push(arr[i])
        }
        answer.sort(function(a,b) {
            return a - b;
        })
    }
    if(answer.length == 0){
            answer.push(-1)
        }
    return answer
}

코드에 보이는 그대로다...

  1. 배열 arr의 길이만큼 실행되는 반복문 내에서 조건문을 굴려 divisor로 arr[i]를 나누었을 때, 나머지가 존재하지 않는다면 그대로 비어있는 answer 배열에 arr[i] 값을 집어넣는다.

  2. 문제의 조건 중, 오름차순으로 정렬하라는 조건이 있었으니 sort() 함수를 사용해 정렬시킨다.

  3. divisor로 나누어떨어지는 요소가 하나도 없다면 answer 배열에 아무런 요소도 들어가지 못해 텅 비어있다는 뜻이니, length가 0인 점을 이용해 다시 조건문을 돌려 빈 answer 배열에 -1을 추가해 리턴한다.

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

문제의 '내적'에 괜히 집착하느라 쓸데없는 시간을 한참 보냈다.
이미 공식이 주어졌기 때문에 내적의 개념을 몰라도 풀 수 있는 문제다.
영문 위키의 링크를 걸어놓다니 이 사기꾼들. (플머스:ㅠㅠ?)

문제는 아주아주 쉽다. 반복문을 사용해 a와 b의 위치별 각 요소들을 곱해 모두 더해주면 된다.

function solution(s){
    let answer = '';
    let countp = 0;
    let county = 0;
    
    answer = s.toLowerCase()
    
    for ( let i = 0; i < s.length; i++) {
        if(answer[i]=="p") {
            countp+=1
        } else if(answer[i]=="y") {
            county+=1
        }
    }
    if (countp==county) {
        return true
    } else {
        return false
    }
}

먼저, 대문자와 소문자가 나뉘어져 있어 생기는 불상사를 방지하기 위해 미리 문자열 S를 toLowerCase() 함수로 전부 소문자화 시키고, 변수 answer에 담는다.

이후 반복문과 조건문을 통해 answer[i]가 p일 경우 countp에 1을, y일 경우 county에 1을 더한다.

문자열의 모든 요소가 돌아가고 난 뒤, 다시 조건문을 이용해 countp와 county의 값을 비교한다. 둘이 같을 경우 true를, 아닐 경우 false를 출력한다.

function solution(s) {
    let answer = true;
    
    if (s.length == 4 || s.length == 6) {
       if (parseInt(s) == s) {
                return answer
            } else {
                answer = false 
            }
    } else {
        answer = false
    }
    return answer
}

테스트 케이스 3과 11 때문에 골머리를 싸맨 문제다...!

가장 먼저 조건문을 이용해 문자열 s의 길이가 4, 혹은 6인지를 먼저 검증한다. 그 외의 길이일 경우 바로 return false!

길이 조건을 충족한 문자열들은 다시 조건문을 통해 정수화한 문자열 s와, 처음 그대로의 s가 같은지 비교하고, 같은 경우(모든 요소가 숫자일 경우) true를, 아닐 경우 false를 출력한다.

parseInt(string,radix(진수)) : 문자열 인자를 파싱하여 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환한다. radix는 생략 가능하다. 이 경우 10진수가 기본값.

테스트 케이스 3과 11 검증에 실패할 경우 : 해당 문제에서 isNaN을 사용할 경우 1e11같은 배열을 진수로 인식해 true를 출력해버린다. parseInt를 사용하자!

function solution(seoul) {
    let answer = '';
 
    for (let i = 0; i < seoul.length; i++) {
        if (seoul[i] == "Kim") {
            answer = "김서방은 "+i+"에 있다" 
        }
    }
    return answer;
}

쉬운 문제였다!
배열 seoul의 요소가 "Kim"과 동일한지 비교한다.
동일할 경우 예시처럼 출력되도록 만든다. 띄어쓰기 주의!

김서방 집으로 돌아가.




내일부턴 삼항연산자를 사용해보기로.

condition ? exprIfTrue : exprIfFalse

condition (조건문)
조건문으로 들어갈 표현식

exprIfTrue (참일 때 실행할 식)
condition이 Truthy일 때 실행되는 표현식입니다. (true일 때 치환될 값입니다).

exprIfFalse (거짓일 때 실행할 식)
condition이 falsy일 때 실행되는 표현식입니다. (false일 때 치환될 값입니다).

예제

var age = 26;
var beverage = (age >= 21) ? "Beer" : "Juice";
console.log(beverage); // "Beer"
profile
가보자고

0개의 댓글