문제
여러 종류의 의상을 매치 시키는 문제이다
약 8개월 전에 풀었던 프로그래머스의 '의상' 문제와 동일한 문제.
240320 의상
문제 설명 코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다. 예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추
kinggh.tistory.com
당시에는 그냥 풀이를 보고 이해 없이 풀었는데, 이 문제를 다시 풀며 완벽히 이해할 수 있었다.
풀이
입력이 까다로워서, 입력을 제외하고 첫번째 TC만 보자
headgear에 hat, turban이 있고
eyeware에 sunglasses가 있다.
각 종류별 2개, 1개의 의상이 있기 때문에
각 의상들을 매치하는 경우는 2x1 = 2개일 것이다
하지만 이는 '모든 종류의 의상을 다 입는 경우'에만 해당하는 경우이다.
문제에서는 한번 옷을 입을 때, 모든 종류의 의상을 다 입어야 한다는 말이 없기 때문에
하루는 모자만, 하루는 터번과 선글라스, 하루는 선글라스만 등등
하루에 한가지 종류의 의상만 착용해도 된다는 말이다
일차 | hadgear | eyeware |
1 | x | x |
2 | x | sunglasses |
3 | hat | x |
4 | hat | sunglasses |
5 | turban | x |
6 | turban | sunglasses |
한 종류의 의상 중 아무것도 착용하지 않는 경우를 x라고 생각한다면
headgear = [x, hat, turban]
eyeware = [x,sunglasse]
라고 볼 수 있다.
따라서, (한 종류의 의상 개수 + 1) 한 값들을 모두 곱해준 뒤,
아무것도 입지 않는 경우 1가지만 빼주면 된다.
코드
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
const n = input.shift();
const ans = [];
for (let i = 0; i < input.length; i++) {
if (!isNaN(input[i] / 1)) {
const num = input[i] / 1;
const clothes = input.slice(i + 1, i + num + 1);
const obj = {};
clothes.forEach((el) => {
const [kind, type] = el.split(" ");
if (!obj[type]) obj[type] = [];
obj[type].push(kind);
});
const kinds = Object.values(obj);
ans.push(kinds.reduce((acc, cur) => acc * (cur.length + 1), 1) - 1);
}
}
console.log(ans.join("\n"));
process.exit(0);
});
첫번째 입력은 빼고, 두번째 입력부터 해당 입력이 숫자라면, 그 숫자만큼 input에서 잘라내 의상의 종류를 배열로 만든다
이후 객체에 각 종류별 의상을 담고, 의상들의 개수에 1을 더해 모두 곱한 뒤, 최종 결과에서 -1을 빼주면 된다
'코딩 테스트 풀이 > 백준' 카테고리의 다른 글
[C4] 11725 - 트리의 부모찾기 (0) | 2024.12.06 |
---|---|
[C3] 5430 - AC (0) | 2024.12.04 |
[C4] 1149 - RGB거리 (3) | 2024.11.28 |
[C3] 1260 - DFS와 BFS (0) | 2024.11.27 |
[C3] 14940 - 쉬운 최단거리 (1) | 2024.11.18 |