2022. 1. 5. 11:00ㆍWEB Dev/CordingTEST
쉬운문제여서 도전했는데 역시 쉬운 것은 없었고 조져지는 것은 나였다...
[문제] 문자열 다루기 기본
문자열의 길이가 4이거나 6이고, 숫자로만 구성되어있는지 확인하는 함수를 구현하면 된다.
주어지는 문자는 1개부터 8개의 글자로 이루어져 있고, 숫자와 문자가 혼합될 수 있다.
길이가 4이거나 6이고, 숫자로만 되어 있는 조건을 만족하면 true를 출력하면 된다.
[풀이]
어제까지 만든 코드를 돌려서 sArray를 출력해보았다.
function solution(s) {
var answer = true;
var leng = s.length;
if(leng >= 1 || leng <= 8){ // or 1 <= leng <= 8
if (leng == 4 || leng == 6){
var sArray = s.split('');
}
}
return sArray;
}
일단 순회를 할 수 있게 배열로 풀어지기는 했는데, 내가 isNaN 함수 사용하는게 헷갈려서 그런걸까?
우선 isNaN에 대해 복습.
isNaN은 숫자가 아닌 것을 찾아 주는 함수라고 생각하면 된다. 숫자가 아니면 true, 숫자이면 false이다.
풀어서 is Not a Number? 이렇게 생각하면 쉽다.
var a = 'a';
var b = '1';
isNaN(a) //true
isNaN(b) //false
sArray로 주어진 문자열을 순회할 수 있도록 배열로 분리했으면 순회해서 true가 하나라도 있으면 false를 내보내고, 전부 false면 ture를 내보내도록 조건문을 다시 짜야 할 것 같다.
조건문이 이렇게 많아도 되나?
순회는 forEach를 사용하고, every를 쓴 다음 every로 검사해서 모두 false면 true를 리턴하고, 아니면 false를 리턴하게 해줘보자.
function solution(s) {
var answer = true;
var sArray = s.split('');
var leng = sArray.length;
const isNaNs = (v, i) => { if(isNaN(v) == false){return true} return false }
if(leng >= 1 || leng <= 8){ // or 1 <= leng <= 8
if (leng == 4 || leng == 6){
answer = sArray.every(isNaNs)
}
}
return answer;
}
테스트 케이스는 전부 통과했는데 ㅠㅠㅠㅠㅠㅠ 왜인지 채점에서 실패했다.
질문들을 보니 우선 숫자 'e' 는 지수로 변환될 수 있어서 안된다고 한다. 테스트 케이스 추가해보니 이건 문제없이 통과. 길이 제한사항을 조건문에 넣었는가? OK
그래서 조건문을 조금 더 간결하게 해서 다시 채점했더니 이번엔 두 개가 틀렸다.
function solution(s) {
var answer = true;
var sArray = s.split('');
var leng = sArray.length;
var isNaNs = (v, i) => { if(isNaN(v) == false){return true} return false }
if(1 <= leng <= 8 || leng == 4 || leng == 6){
answer = sArray.every(isNaNs)
}
return answer;
}
5번과 6번은 문자열 길이라던데.. (11번은 아까 말한 문자 e를 지수로 해석해서)
찾아보니 5,6번은 문자열 길이 조건이 아니면 false 처리를 안해서 그렇다고 한다..
그래서 else로 처리를 해주었는데 어째서 통과가 안될까 ㅠㅠ
function solution(s) {
var answer = true;
var sArray = s.split('');
var leng = sArray.length;
var isNaNs = (v, i) => { if(isNaN(v) == false){return true} return false }
if(1 <= leng <= 8 || leng == 4 || leng == 6){
answer = sArray.every(isNaNs)
} else {
answer = false;
}
return answer;
}
문제는 자리수 체크에서 1~8개 || 4이거나 6이거나 를 OR로 했다는 거다!!!
AND로 바꿔주면 통과 ㅠㅜㅠㅠㅠ
function solution(s) {
var answer = true;
var sArray = s.split('');
var leng = s.length;
var isNaNs = (v, i) => { if(isNaN(v) == false){return true} return false }
if(1 <= leng <= 8 && leng == 4 || leng == 6){
answer = sArray.every(isNaNs)
} else {
answer = false;
}
return answer;
}
더 간결하고 예쁜 코드를 짜고 싶었지만 이정도도 훌륭하다!
'WEB Dev > CordingTEST' 카테고리의 다른 글
[매일코딩-프로그래머스] 직사각형 별찍기 01 (0) | 2022.01.11 |
---|---|
[매일코딩-프로그래머스] 핸드폰 번호 가리기 01 (0) | 2022.01.10 |
[매일코딩-프로그래머스] 문자열 다루기 기본 01, 02 (0) | 2022.01.04 |
[매일코딩-프로그래머스] 완주하지 못한 선수 02 + Hash란? (0) | 2021.12.28 |
[매일코딩-프로그래머스] 완주하지 못한 선수 01 (0) | 2021.12.27 |