본문 바로가기

알고리즘/프로그래머스

[2019 카카오 개발자 겨울 인턴쉽] 튜플

⭐️ 튜플

레벨2 문제입니다.

split 을 이용해서 잘 나눠주고 길이로 정렬을 해줍니다. 그 후 set의 difference 함수를 이용해서 차이만큼 결과 리스트에 더해줍니다.

 

def solution(s):
    answer = set()
    result = []
    srcs = s[2:-2].split('},{')
    srcs.sort(key=lambda x : len(x))
    for src in srcs:
        temp = set(list(map(int, src.split(','))))

        result = result + list(set.difference(temp, answer))
        answer=temp

    return result

 

다음은 프로그래머스 다른 사람 풀이에서 본 좋은 풀이입니다.

 

def solution(s):
    # {{, }}를 제거 후 },{ 으로 나누기
    data = s[2:-2].split("},{")
    # 길이 별로 오름차순 정렬
    data = sorted(data, key=lambda x: len(x))
    answer = []
    for item in data:
        # 각각의 원소로 분류 후
        print(item)
        item = list(map(int, item.split(",")))
        print(item)
        for value in item:
            # 포함되어 있지 않으면 input
            if value not in answer:
                answer.append(value)
    return answer

 

다음은 JavaScript 풀이 입니다. 주로 Python으로 풀지만 JavaScript로 푸는 것도 익숙해지려고 연습중입니다.!!!!

 

function solution(s) {
    let answer = [];
    console.log(s)
    let replaced = s.split('').map(str => str.replace('{', '[').replace('}',']'));
    let arr = JSON.parse(replaced.join('')).sort((a,b) => a.length - b.length);
    console.log(arr)
    arr.forEach(a => answer.push(...a.filter(item => !answer.includes(item))))
    return answer;
}
const tupleFrom = (str) =>
  str.slice(2, -2).split('},{')
    .map((it) => toNumbers(it))
    .sort(accendingByLength)
    .reduce((acc, cur) =>
      [...acc, ...cur.filter((it) => !acc.includes(it))], []);

const toNumbers = (str) => str.split(',').map(it => Number(it));

const accendingByLength = (arr1, arr2) => arr1.length - arr2.length;

const solution = (s) => tupleFrom(s);