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
사족..