[프로그래머스] 롤케이크 자르기
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/132265
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 풀이
- 처음엔 slice()를 이용하여 진행했었다.
function solution(topping) {
let answer = 0;
for(let i = 0; i < topping.length; i++){
const a = new Set(topping.slice(0, i));
const b = new Set(topping.slice(i, topping.length));
if(a.size === b.size) answer += 1;
}
return answer;
}
- topping의 길이까지 반복을 하면서 구간별로 잘라서 크기를 비교했었다. 하지만 시간초과!!
- 이후 map()을 이용해서 진행했다. 어떻게 진행할 지 몰라서 검색함 ㅠ
function solution(topping) {
let answer = 0;
const countTopping = new Map();
const bro = new Map();
topping.forEach((n) => {
countTopping.set(n, (countTopping.get(n) || 0) + 1);
});
topping.forEach((n) => {
countTopping.set(n, countTopping.get(n) - 1);
if(!countTopping.get(n)) countTopping.delete(n);
bro.set(n, (bro.get(n) || 0) + 1);
if(countTopping.size === bro.size) answer++;
})
return answer;
}
- topping을 반복하면서 모든 토핑의 개수를 확인해둘 countTopping을 map으로 만들어둔다.
- 다시 topping 반복하면서 countTopping에 있는 개수를 하나씩 빼준다. 하나씩 뺄 때마다 bro map에 추가한다.
- 만약 countTopping의 topping이 0개라면 삭제한다.
- countTopping의 size와 bro의 size가 같아지면 answer 증가!
3. 정리
- 아직 set과 map을 활용하지 못한다. 연습해야겠다. set과 map은 시간 측면에서 굉장히 유용하게 작업할 수 있기 떄문에 꼭 알아둬야겠다.
- 참고한 사이트는
https://leejams.github.io/%EB%A1%A4%EC%BC%80%EC%9D%B4%ED%81%AC-%EC%9E%90%EB%A5%B4%EA%B8%B0/
한 번 보고 이렇게 하는거구나 하고 작성했는데 위의 사이트로 작성하는 편이 더 좋아보인다.
굳이 bro의 개수까지 구할 필요는 없었다~~
그리고 bro의 사이즈가 더 커지면 반복문을 종료하는 것도 시간 측면에서 굉장히 중요하다!!!