Covenant


Kakao: 자네 인턴하고 싶지 않나?..


📦 튜플 문제 확인


  • 문제 링크
  • 문제를 대충보면 이해하기 힘들 수 있습니다.
  • 문제의 입력으로 집합기호 안에 자연수가 주어지며 이를 바탕으로 튜플을 리턴하는 것입니다.


👀 입력값 관찰

s = "{{2},{2,1},{2,1,3},{2,1,3,4}}"
{2}
{2, 1}
{2, 1, 3}
{2, 1, 3, 4}
  • 배열 길이를 기준으로 오름차순 정렬을 합니다.
  • 길이가 1인 집합에 2가 있습니다. --> 정답 튜플에 2가 들어갑니다. (현재 정답 튜플 값 (2))
  • 다음 집합에는 2와 1이 있습니다. --> 정답 튜플에 2가 있으므로 1이 2 다음에 옵니다. (현재 정답 튜플 값 (2, 1))
  • 다음 집합에는 2와 1 그리고 3이 있습니다. --> 정답 튜플에 2, 1이 있으므로 3이 1 다음에 옵니다. (현재 정답 튜플 값 (2, 1, 3))
  • 다음 집합에는 2와 1, 3 그리고 4가 있습니다. --> 정답 튜플에 2, 1, 3이 있으므로 4가 3 다음에 옵니다. (현재 정답 튜플 값 (2, 1, 3, 4))
  • 따라서 [2, 1, 3, 4]를 리턴하면 됩니다.


✏️ 문제 해결방법


  • 카카오 코딩테스트를 볼 때 문자열 처리, 예외 처리에 유의해야합니다.
  • 특히 "{{123}}" 과 같은 base 문자 처리를 신경써야합니다.
  • 본 문제를 두 단계로 나누어서 해결해 보겠습니다.


✔️ STEP 1. 문자열 처리

s = "{{2},{2,1},{2,1,3},{2,1,3,4}}"
  • set 안에 set이 있는 구조입니다. 따라서 시작 문자열과 끝 문자열 2개의 {와 } 글자를 제거해야 합니다.
  • {2},{2,1}과 같이 서로 다른 집합 간에 },{ 으로 구분되어 있습니다.
  • 따라서 위의 두 가지 관찰한 결과를 가지고 아래와 같이 코드를 작성할 수 있습니다.
    S = S[2:-2].split("},{")
  • 위의 코드를 실행하면 아래와 같습니다.
['1,2,3', '2,1', '1,2,4,3', '2']
  • '1,2,3' 를 ,를 기준으로 set을 만들 것입니다.
  • set을 만드는 이유는 STEP 2 정답 튜플을 고르기에서 차집합 연산을 사용할 것입니다.
for i in range(len(S)):
    s = S[i].split(",")
    numArr.append(set(s))
numArr.sort(key=lambda x: len(x))
  • set 원소의 길이를 기준으로 오름차순으로 정렬해야합니다.
  • 알고리즘 문제를 풀면 원소 값을 기준으로 정렬을 하지, 원소의 길이로 정렬할 일은 흔치 않을 것입니다.
  • len(x)를 하면 간단하게 할 수 있습니다.


✔️ STEP 2. 정답 튜플을 고르기

    res = []
    ans = set()
    for a in numArr:
        tmp = a - ans
        res.append(list(tmp)[0])
        ans = ans | tmp

    res = [int(i) for i in res]
    return res
  • 원소의 갯수가 K인 집합과 K+1 집합의 차집합을 tmp에 저장합니다.
  • 문제에서 자연수로 반환해야 합니다. set 자료형의 특성상 값을 접근하기 위해서는 리스트 혹은 튜플로 변환해야 합니다.
  • list로 변환하고 [0]번째 인덱스 값을 넣습니다.
  • 문제에서 자연수로 반환해야 하기 때문에 res = [int(i) for i in res] 로 res 값의 원소를 자연수로 변환합니다.


⭕ 최종 풀이


def solution(S):
    S = S[2:-2].split("},{")
    numArr = []
    for i in range(len(S)):
        s = S[i].split(",")
        numArr.append(set(s))

    numArr.sort(key=lambda x: len(x))

    ans = set()
    res = []
    for a in numArr:
        tmp = a - ans
        res.append(list(tmp)[0])
        ans = ans | tmp

    res = [int(i) for i in res]
    return res


사족..


  • 문자열 처리는 파이썬이 짱