구보현 블로그

Jewels and Stones

20180820

문제

You're given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type of stone you have. You want to know how many of the stones you have are also jewels.

The letters in J are guaranteed distinct, and all characters in J and S are letters. Letters are case sensitive, so "a" is considered a different type of stone from "A".

Python

내 풀이

import functools
def numJewelsInStones(self, J, S):
    jewels = 0
    for jewel in J:
        jewels += S.count(jewel)
    return jewels

python count() method

substring 이 정해진 범위에서 몇 번 나오는지 그 숫자를 반환해주는 함수 str.count(sub, start= 0,end=len(string))

다른 사람 풀이

def numJewelsInStones(self, J, S):
    return sum(map(S.count, J))

map 함수를 써서 stone 에 포함 된 jewel 리스트 요소의 수를 새로운 리스트로 반환하고 sum 메소드를 사용하여 리스트 요소의 합을 구한다.

def numJewelsInStones(self, J, S):
    return sum(map(J.count, S))
def numJewelsInStones(self, J, S):
    return sum(s in J for s in S)
def numJewelsInStones(self, J, S):
        setJ = set(J)
        return sum(s in setJ for s in S)

python 집합 자료형

>>> s1 = set([1,2,3])
>>> s1
{1,2,3}

# 값 1 개 추가하기
>>> s1.add(4)
>>> s1
{1,2,3,4}

# 값 여러 개 추가하기
>>> s1.update([4,5,6])
>>> s1
{1,2,3,4,5,6}

# 특정 값 제거하기
>>> s1.remove(2)
>>> s1
{1,3,4,5,6}

집합 자료형의 특징

  • 중복을 허용하지 않는다.
  • 순서가 없다. => 인덱싱을 제공하지 않는다.
  • 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용되기도 한다.

이 문제를 푼 사람은 jewels 가 중복된 문자열일 수도 있다고 생각했기 때문인 것 같다.

하지만 이 문제에서는 jewels 가 중복되지 않는다고 되어있다.

Javascript

var numJewelsInStones = function(J, S) {
  var stones = new Map();

  for (i = 0; i < S.length; i++) {
    if (stones.has(S[i])) {
      var value = stones.get(S[i]) + 1;
      stones.set(S[i], value);
    } else {
      stones.set(S[i], 1);
    }
  }
  var jewles = 0;
  for (i = 0; i < J.length; i++) {
    if (stones.has(J[i])) {
      jewles += stones.get(J[i]);
    }
  }
  return jewles;
};

string 은 내부적으로 배열이기 때문에 J.split('')을 해주지 않아도 된다.