반응형
문제
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 함수에 넣는다.
}
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스|파이썬] 달리기 경주 (연습문제/level 1) (0) | 2023.04.27 |
---|---|
[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.10 |
[프로그래머스 | 파이썬 / 자바스크립트] 타겟 넘버(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.02 |
[프로그래머스 | 파이썬 / 자바스크립트] 추억 점수(연습문제 / level 1) (0) | 2023.03.31 |
[프로그래머스 | 파이썬 / 자바스크립트] 평행(코딩테스트 입문 / level 0) (0) | 2023.03.16 |
[프로그래머스 | 파이썬 / 자바스크립트] 다리를 지나는 트럭(스택/큐 / level 2) (0) | 2023.03.16 |