목차
1. 문제 설명
2. 문제 풀이
3. 정답 코드
1. 문제 설명
다음 문제는 롤케이크를 자르는 문제이다.
롤케이크에는 토핑이 올라가 있으며, 토핑의 종류는 숫자로 표시된다. (ex. 1, 2, 3...)
철수는 롤케이크를 2조각으로 나눠 동생과 나눠가져야하는데,
공평하게 나누기 위하여 다음 조건을 만족해야한다.
=> 토핑의 가지수가 동일해야 함
이 때, topping의 개수가 1,000,000로 매우 큰 숫자임을 주의해야한다.
2. 문제 풀이
topping의 개수가 1,000,000로 매우 큰 숫자이므로, 롤케이크를 자르는 행위는 선형 탐색으로 해결해야한다는 것을 알았다.
변수
각 조각이 가진 토핑들을 저장할 객체와 가짓 수를 카운트할 변수를 선언해야한다.

로직
1. 초기 상태 : 모든 토핑을 오른쪽 조각에 우선 배치한다.
2. 왼쪽에서 오른쪽으로 한 조각씩 이동하면서 자른다.
3. 양쪽의 토핑 가짓수가 같다면 카운트를 증가한다.

3. 정답 코드
function solution(topping) {
var answer = 0;
// 각 조각이 가진 토핑들을 저장하는 객체
let left = {}; // 왼쪽 조각: {토핑 번호: 해당 토핑의 개수}
let right = {}; // 오른쪽 조각: {토핑 번호: 해당 토핑의 개수}
// 각 조각이 가진 토핑의 종류 수를 카운트
let leftToppingTypes = 0; // 왼쪽 조각의 토핑 종류 수
let rightToppingTypes = 0; // 오른쪽 조각의 토핑 종류 수
// 1. 초기 상태: 모든 토핑을 오른쪽 조각에 배치
for (const v of topping) {
if (!right[v]) {
right[v] = 1;
rightToppingTypes += 1; // 새로운 종류의 토핑이 추가될 때만 증가
} else {
right[v] += 1;
}
}
// 2. 왼쪽에서 오른쪽으로 한 조각씩 자르면서 공평한 분배 찾기
for (let i = 0; i < topping.length - 2; i++) {
const cur = topping[i]; // 현재 처리할 토핑 번호
// 오른쪽 조각에서 토핑 하나 제거
right[cur] -= 1;
if (right[cur] === 0) {
// 해당 종류의 토핑이 오른쪽에서 아예 사라진 경우
rightToppingTypes -= 1;
}
// 왼쪽 조각에 토핑 하나 추가
if (!left[cur]) {
left[cur] = 1;
leftToppingTypes += 1; // 새로운 종류의 토핑 추가
} else {
left[cur] += 1;
}
// 양쪽의 토핑 가짓수가 같다면, 카운트 증가
if (leftToppingTypes === rightToppingTypes) {
answer += 1;
}
}
return answer;
}
문제 바로가기
https://school.programmers.co.kr/learn/courses/30/lessons/132265
'Algorithm' 카테고리의 다른 글
[Javascript] 더 맵게 (0) | 2025.01.11 |
---|---|
[Javascript] 가장 큰 수 (0) | 2025.01.11 |
순열, 조합 문제 풀이 (with. Python) (3) | 2024.12.13 |
백준 21315. 카드 섞기 (1) | 2024.12.07 |
백준 14226. 이모티콘 (0) | 2024.10.31 |