코딩연습

[프로그래머스] 롤케이크 자르기

니 뽀 2023. 6. 26. 18:06

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의 사이즈가 더 커지면 반복문을 종료하는 것도 시간 측면에서 굉장히 중요하다!!!