문제
풀이
입출력이 위와 같이 주어진다.
문제의 주요한 조건은 다음과 같다.
튜플은 중복된 원소가 있을 수 있지만, 이 문제에서는 중복되는 원소가 없는 튜플이 주어진다.
튜플 원소에는 정해진 순서가 있으며 개수가 유한하다.
위의 조건을 보면
튜플은 [2,1,3,4]로 정해져 있지만, 집합으로서 다양하게 표현할 수 있다.
또한 집합 내 원소들의 순서 또한 바뀌어도 상관이 없다.
이 조건들을 바탕으로 문제를 풀어보자.
풀이 방향
입출력이 문자열 s 형태로 주어진다.
자바스크립트에서 {{}} 형태는 객체이므로, 우선 문자열 s를 가지고 가공하는 것이 낫다.
그러므로 문자열을 다듬어서 우선 각 집합들을 배열의 원소로서 넣어주면 편할 듯 하다.
배열의 각 인덱스에 집합을 넣어줬으면, 집합의 크기 순서대로 정렬한다.
배열 내 집합들을 오름차순으로 정렬해야 "튜플 원소의 정해진 순서"를 구할 수 있다.
정답을 위한 배열을 선언하고,
배열 내 집합들을 순회하면서, 집합 내 원소들이 정답 배열에 없다면 추가해준다.
이를 바탕으로 코드를 작성한다.
코드
function solution(s) {
const answer = [];
s.slice(2, s.length - 2) // 번호 1
.split("},{") // 번호 2
.map((str) => str.split(",").map(Number)) // 번호 3
.sort((a, b) => a.length - b.length) // 번호 4
.forEach((arr) => { // 번호 5
arr.forEach((v) => {
if (!answer.includes(v)) answer.push(v);
});
});
return answer;
}
위에서 설명했지만 코드의 수행 절차는 다음과 같다.
s = "{{1,2,3},{2,1},{1,2,4,3},{2}}" 라고 생각해보자.
번호 | 수행한 메서드 | 결과 |
---|---|---|
1 | slice | "1,2,3},{2,1},{1,2,4,3},{2" |
2 | split | ["1,2,3", "2,1", "1,2,4,3", "2"] |
3 | map | |
4 | sort | |
5 | forEach | 반환값이 없다. |
다음의 과정을 거친다.
위와 같이 연속된 체인으로 작성할 수 있는 이유는
forEach를 제외한 slice,split,map,sort메서드가 수행 결과를 반환값으로 주기 때문이다.
마지막 forEach에서는 answer 배열에 넣어주는 작업을 하기 때문에 반환값이 필요하지 않다.
수행 결과를 반환값으로 주는 의미는 아래를 보면 되겠다.
s.slice(2, s.length - 2).split("},{") 코드는 slice의 수행 결과
"1,2,3},{2,1},{1,2,4,3},{2".split("},{") 이 되고 split의 수행 결과
["1,2,3", "2,1", "1,2,4,3", "2"]를 반환하기 때문에
반환 값을 이용해 연속적으로 배열의 프로토타입 메서드 map을 사용할 수 있다.
'DS & Algorithm > programmers' 카테고리의 다른 글
[프로그래머스] 파일명 정렬 - 자바스크립트 (0) | 2021.06.24 |
---|---|
[프로그래머스] 피보나치 수 - 자바스크립트 (0) | 2021.06.19 |
[프로그래머스] 오픈 채팅방 - 자바스크립트 (0) | 2021.06.19 |
[프로그래머스] 소수 찾기 - 자바스크립트 (0) | 2021.06.18 |
[프로그래머스] 괄호 변환 - 자바스크립트 (0) | 2021.06.18 |