본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 | 파이썬 / 자바스크립트] 스킬트리(Summer/Winter Coding(~2018) / level 2)

by 청량리 물냉면 2023. 4. 2.
반응형
문제

https://school.programmers.co.kr/learn/courses/30/lessons/49993 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🐍파이썬
def solution(skill, skill_trees):
    answer = 0
    for i in skill_trees:
        s_list = list(skill)
        for j in i:
            if j in skill:
                if j != s_list.pop(0):
                    break
        else:
            answer += 1
    return answer
💠 Example

skill = "CBD"
skill_trees = ["BACDE", "CBADF", "AECB", "BDA"] 일 때, for문을 순차적으로 돌면 아래와 같은 결과가 나온다.

1회 (i = "BACDE")
s_list = ["C", "B", "D"]
만약 j (= "B")가 skill("CBD")에 존재한다면,
"B"(j) != "C"(s_list.pop(0))
break

2회 (i = "CBADF")
s_list = ["C", "B", "D"]
만약 j (= "C")가 skill("CBD")에 존재한다면,
"C"(j) == "C"(s_list.pop(0))
만약 j (= "B")가 skill("CBD")에 존재한다면,
"B"(j) == "B"(s_list.pop(0))
만약 j (= "A")가 skill("CBD")에 존재한다면,(A는 skill에 존재하지 않으므로 skip)
만약 j (= "D")가 skill("CBD")에 존재한다면,
"D"(j) == "D"(s_list.pop(0))
만약 j (= "F")가 skill("CBD")에 존재한다면,(F는 skill에 존재하지 않으므로 skip)
for문을 모두 돌 때까지 break 등을 통한 이탈이 일어나지 않았으므로 answer += 1

...3회, 4회는 생략

 

 

다른 풀이 방법

def solution(skill,skill_tree):
    answer = 0
    for i in skill_tree:
        skillist = ''	#skillist 초기화
        for z in i:	#skill_tree 안의 문자열을 한글자씩 확인
            if z in skill:	#글자가 skill에 들어있는 글자라면
                skillist += z	#해당 글자를 skillist에 추가
        if skillist == skill[0:len(skillist)]:	
            answer += 1		#skillist와 skill의 0~len(skillist)까지의 값이 같다면 answer + 1
    return answer

 

 

🐥자바스크립트
function solution(skill, skill_trees) {
    var answer = 0;
    for(let i of skill_trees){
        let arr = skill.split('');
        let flag = 1;
        for(let j of i){
            if(arr.includes(j)){
                if(j !== arr.shift()){
                    flag = 0;
                    break;
                }
            }
            
        }
        if(flag === 1)  {answer++;}
    }
    return answer;
}
💠 Example

skill = "CBD"
skill_trees = ["BACDE", "CBADF", "AECB", "BDA"] 일 때, for문을 순차적으로 돌면 아래와 같은 결과가 나온다.

1회 (i = "BACDE")
arr = ["C", "B", "D"]
만약 j (= "B")가 skill("CBD")에 존재한다면,
"B"(j) != "C"(arr.shift())
flag = 0
break

flag = 0
이면 for문 도중 break 등을 통한 이탈이 일어났다는 뜻이므로 answer 에 아무것도 더하지 않는다.


2회 (i = "CBADF")
arr = ["C", "B", "D"]
만약 j (= "C")가 skill("CBD")에 존재한다면,
"C"(j) == "C"(arr.shift())
만약 j (= "B")가 skill("CBD")에 존재한다면,
"B"(j) == "B"(arr.shift())
만약 j (= "A")가 skill("CBD")에 존재한다면,(A는 skill에 존재하지 않으므로 skip)
만약 j (= "D")가 skill("CBD")에 존재한다면,
"D"(j) == "D"(arr.shift())
만약 j (= "F")가 skill("CBD")에 존재한다면,(F는 skill에 존재하지 않으므로 skip)
flag = 1

flag = 1이면 for문을 모두 돌 때까지 break 등을 통한 이탈이 일어나지 않았다는 뜻이므로 answer += 1

...3회, 4회는 생략

 

 

다른 풀이 방법

function solution(skill, skill_trees) {
    var answer = 0;
    var regex = new RegExp(`[^${skill}]`, 'g');	//정규식을 통해 skill 아닌 알파벳의 객체생성
    //regex = /[^CBD]/g
    return skill_trees
        .map((x) => x.replace(regex, ''))	//skill 아닌 알파벳을 모두 삭제, ["BCD","CBD","CB","BD"]
        .filter((x) => {
            return skill.indexOf(x) === 0 || x === "";	
            // skill에서 배열의 첫글자 인덱스가 0인 경우(==배열의 첫글자와 skill의 첫글자가 동일한 경우) 
            // or skill에 해당되는 글자가 하나도 없는 경우
        })	//["CBD","CB"]
        .length
}

function solution(skill, skill_trees) {
    function isCorrect(n) {
        // const test = '[' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').filter(v => !skill.includes(v)).join('') + ']*';
        let test = skill.split('');
        for (var i = 0; i < n.length; i++) {	//문자열의 모든 글자를 확인
            if (!skill.includes(n[i])) continue;	//글자가 skill에 존재하지 않으면 다음 글자를 확인
            //글자가 skill에 존재한다면
            if (n[i] === test.shift()) continue;	//글자가 skill의 첫문자와 같다면 다음 글자를 확인
            //글자가 skill의 첫문자와 같지 않다면
            return false;	 //false를 리턴
        }
        return true;	//모든 문자를 돌때까지 false가 나오지 않았다면 true 리턴
    }    

    return skill_trees.filter(isCorrect).length;	//skill_trees의 문자열을 하나씩 isCorrect 함수에 넣는다.
}

 

 

반응형