항해 5일차
오늘은 페어 프로그래밍을 하여 팀원들과 알고리즘 문제를 해결해 나갔다. 알고리즘 문제를 풀면서 안풀리는 문제들이 있었다.
간략하게 보자면

이런 문제이다.
문제를 풀면서 날짜에 대한 함수가 있을 거 같아 찾아 보던 중 Date 함수에 대해서 알게 되었다. Date 함수를 응용하면서 이러한 코드를 만들었다.
function solution(a, b) {
let w = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
let date = new Date(2016,a,b)
let day = date.getDay()
return w[day]
}
요일을 나타내는 문자열을 w에 할당하고 2016년 a월 b일 나타내는 Date 객체를 생성하고 getDay()메서드를 이용하여 Date 객체의 요일을 가져온다. 마지막으로 w배열에서 해당하는 요일의 문자열 찾아 반환한다. 이 때 이상한 요일이 나오는 문제점이 생겼다.
Date의 월(달)인 a가 0부터 시작한다는 것
function solution(a, b) { let w = ["SUN","MON","TUE","WED","THU","FRI","SAT"] let date = new Date(2016,a+1,b) let day = date.getDay() return w[day] }a에 1를 더해줘 해결할 수 있었다.
Date 함수에 대해서 알 수 있었다. new Date()를 년,월,[일,시,분,초,밀리초]를 구할 수 있는 것을 알 수 있었고, getDay를 이용하여 주어진 날짜의 현지 시간 기준 요일을 반환한다는 것도 알 수 있었다. 또한 월이 0부터 시작한다는 것도 알 수 있었다.
두 번째 문제는 푼 문제이지만, 신기해서 올렸다.

원래 구현한 코드는
function solution(s){
let p = /p/gi
let y = /y/gi
let array1 = s.match(p)
let array2 = s.match(y)
if(!array1 && !array2){
return true
}else if(!array1 || !array2){
return false
}else if(array1.length === array2.length){
return true
}else{
return false
}
}
정규표현식을 사용하고 match를 사용하여서 문제를 풀었다. 하지만 팀원들과 풀다보니 신기한 점을 볼 수 있었다. 바로 이 코드이다.
function solution(s){
let s2 = s.toUpperCase();
let p의개수 = s2.split("P").length - 1
let y의개수 = s2.split("Y").length - 1
if(p의개수 === y의개수){
return true
} else if(p의개수 !== y의개수){
return false
} else {
return true
}
내가 알던 split은 문자열을 잘라주는 메소드인 줄 알았는데 해당 문자열을 split을 하면 공백과 나눈 값이 나왔다. 즉 ["","PoooyY] 이런 식으로 나왔다. 이것을 통해서 배열의 길이의 -1를 주어 문자의 개수를 알 수 있었다.
세 번째 문제는
https://school.programmers.co.kr/learn/courses/30/lessons/12918

해당 조건에 문제를 풀어 나갔다. 코드 실행에서는 맞았지만, 채점하기에서 틀린 문제로 나왔다.
function solution(s) {
return (s.length === 4 || s.length === 6) && s == Number(s)
}
Number와 같이 숫자로 바꿔주는 parseint에 대해서 알게되었다. parseint는 문자가 섞여있어도 숫자만 그대로 출력해주는 기능이 있는 메소드로 해결할 수 있었다.
function solution(s) { return (s.length === 4 || s.length === 6) && s == parseInt(s) }
isNaN
이 문제에서 요구하는 것처럼 우리가 원하는 '숫자'를 찾아내기엔 무리가 있다.
숫자가 아닌 값도 true로 걸리는 등... 원하는 답을 명확히 찾기 어렵다.
실제로 '0.5'라는 소수를 isNaN로 확인해보았을때 false로 나온다.
Number
ex) '0.5' === 0.5
해당 문자열의 숫자를 있는 그대로 출력한다.
문자열 내에 숫자 말고도 문자가 섞여있으면 무조건 NaN로 나온다
parseInt
ex) '0.5' === 0
소수를 출력해도 해당 소수점은 다 자르고 정수만 나온다.
문자열 내에 숫자 말고도 문자가 섞여있어도 숫자만 그대로 출력해주는 기능이 있다.
마지막 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12931

자릿수 더하기 코드
function solution(n) {
let a = n.toString().split("").reduce((a, b) => parseInt(a) + parseInt(b));
return a
}
왜 맞는 코드인데 안되지? 팀원들과 상의를 했지만, 답이 안나왔다.
문제를 보면 한자리 숫자도 나올 수 있기 때문에 reduce 함수 부분에서 초기 값 0을 주어 해결하였다.
reduce 함수에 초기 값을 설정할 수 있다는 것을 알게 되었다.