본문 바로가기

자바스크립트 입문하기

[프로그래머스/JS] Level2 - 스킬트리 #Set #String

 

https://school.programmers.co.kr/learn/courses/30/lessons/49993?language=javascript#fnref1

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

TIL

- JS에서 filter함수 처음 써봤는데 클로저 쓸때  =>{ }로 표기하면 반드시 return 써야함,, 
	  근데 단일 행일 경우 {} 생략 가능하고, reutrn 생략 가능함. 굿
- JS에서 문자열 prefix 비교는 String.subsctring(index, 배교할문자열) 쓰자
- String.indexOf() 이거는 일치하는 substring의 index를 알려준다. 아닐 경우 -1 반환

문제 접근

 

이 문제를 어떻게 접하면 좋을까?

 

1. 스킬은 중복이 없다.

2. 배워야 할 중요한 스킬은 순서가 있다.

 

좋다. 여러 스킬 중에 배워야 할 중요한 스킬의 순서만 파악하자!

 

제가 놓쳤던 관점 중 하나는 중요한 것은 abc를 배워야하는데, ab만 배워도 올바른 스킬트리이다.

 

 

제 풀이는 다음과 같습니다.

1. 배웠던 스킬트리 에서, filter를 활용해 skill에 포함되지 않는다면 ''로 만들기!

2. 그렇다면 skill의 일부 또는 전부만 남게 되는데, 이때 skill의 부분 문자열로 index 0 부터 ~ 비교하기 prefix를 비교하는 것입니다. 

 

function solution(skill, skill_trees) {
    return skill_trees.reduce(((prev, _skill) => {
        let filtered = [..._skill].filter (v => skill.includes(v) ).join('') 
        prev += skill.substring(0, filtered.length) === filtered ? 1 : 0
        return prev
    }), 0)
}

 

뭔가 부수적인 로직을 전부 제거했습니다.

 

처음에는 JS.Set을 공부해보고 싶어서 Set을 활용했습니다. has를 통해서 마찬가지로 skill 원소가 존재하는 지 여부를 파악하면 됬었습니다.

 

 

약 2년전인가// 그때는 Swift로 어떻게 풀었을까,,

 

func solution(_ skill:String, _ skill_trees:[String]) -> Int {
    let list = skill.map{String($0)}
    var res = 0
    skill_trees.map{ input in
      var visited = Array(repeating: false, count: list.count)
      var skillTree = input.map{String($0)}
      for (i,char) in skillTree.enumerated() {
        if list.contains(char),
           let idx = list.firstIndex(of: char)
        {
          var flag = true
          for ind in (0..<idx) {
            if !visited[ind] { flag = false }
          }
          if !flag { break }
          visited[idx] = true
        }
        if i == skillTree.count-1 { res += 1 }
      }
    }
  return res
}

 

알게된 것

Set의 일부 함수들? add, clear, delete, difference, entries, forEach, has, intersection, keys, union, values, size

 

뭔가 String에서 swift의 prefix같은 함수 있나 찾아봤는데 String.substring이게 거의 유사해보였습니다.

 

다른 분들의 풀이를 보니 String.indexOf를 사용했는데 이것도 좋아보이네요.

substring의 시작 index반환. 그래서 prefix인지 여부는 0부터 시작하는지만 비교하면되고,, 

 

 

References

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set

 

Set - JavaScript | MDN

Set 객체는 값의 컬렉션입니다. Set의 값은 한 번만 나타날 수 있으며, Set의 컬렉션에서는 고유한 값입니다. Set의 요소를 삽입 순서대로 순회할 수 있습니다. 삽입 순서는 각 요소가 add() 메서드에

developer.mozilla.org

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/substring

 

String.prototype.substring() - JavaScript | MDN

기존문자열의 부분 문자열을 반환합니다. substring() 메서드는 indexStart 부터 문자를 추출하지만 indexEnd 가 포함되지 않아도 괜찮습니다. 특징은 아래와 같습니다. 만약 indexEnd 가 생략된 경우, substr

developer.mozilla.org

 

728x90