๐ ํ๋ก๊ทธ๋๋จธ์ค 131702 : ๊ณ ๊ณ ํ ์ต๊ณ ์ ๋ฐ๊ฒฌ - Javascript
2023-02-23
๋ฌธ์ ์ค๋ช
๊ณ ๊ณ ํ์์ธ ํ์ ์ ์ค๋์ ๋ถํฐ ์ฑ๊ถค์ ํ๋ฐฉ์ ์ถ์ ํด์์ต๋๋ค. ๊ทธ๋์ ๊ทธ์ ์ฐ๊ตฌ๋ ์ฃผ๋ฅ ํ์๋ค๋ก๋ถํฐ ์ธ์ ๋ฐ์ง ๋ชปํ์์ง๋ง, ํ์ ์ด๋ ํฌ๊ธฐํ์ง ์๊ณ ์กฐ์ฌ๋ฅผ ๊ณ์ํ๊ณ ๋ง์นจ๋ด ์ฑ๊ถค์ ํ๋ฐฉ์ ์์๋ด์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค๋์ ๋๊ตฐ๊ฐ๋ก๋ถํฐ ๋ด์ธ๋ ์ฑ๊ถค๋ ํน๋ณํ ์ ๊ธ์ฅ์น์ ์ํด ๋ณดํธ๋๊ณ ์์์ต๋๋ค. ์ ๊ธ์ฅ์น๋ ์ผ์ข ์ ํผ์ฆ๊ณผ ์ฐ๊ฒฐ๋์ด ํผ์ฆ์ ํด๊ฒฐํ๋ฉด ์ด๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
ํผ์ฆ์ ์๊ณ๋ค์ด ํ๋ ฌ์ ์ด๋ฃจ๋ ๊ตฌ์กฐ๋ฌผ์ธ๋ฐ ํ๋์ ์๊ณ์ ์๊ณ๋ฐ๋์ ํ๋์ฉ๋ง ์์ต๋๋ค. ๊ฐ ์๊ณ๋ฐ๋์ ์๊ณ๋ฐฉํฅ์ผ๋ก๋ง ๋๋ฆด ์ ์๊ณ ํ ๋ฒ์ ์กฐ์์ผ๋ก 90๋์ฉ ๋๋ฆด ์ ์์ต๋๋ค. ์๊ณ๋ค์ ๊ธฐ๊ณ์ฅ์น์ ์ํด ์ฐ๊ฒฐ๋์ด ์์ด ์ด๋ค ์๊ณ์ ์๊ณ๋ฐ๋์ ๋๋ฆฌ๋ฉด ๊ทธ ์๊ณ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์๊ณ๋ค์ ์๊ณ๋ฐ๋๋ ํจ๊ป ๋์๊ฐ๋๋ค. ํ๋ ฌ์ ๋ชจ์๋ฆฌ์ ์์นํ ์๊ณ์ ์๊ณ๋ฐ๋์ ๋๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ์ธ์ ํ ์ธ ์๊ณ์ ์๊ณ๋ฐ๋๋ค์ด ํจ๊ป ๋์๊ฐ๋ฉฐ, ๊ผญ์ง์ ์ ์์นํ ์๊ณ์ ์๊ณ๋ฐ๋์ ๋๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ์ธ์ ํ ๋ ์๊ณ์ ์๊ณ๋ฐ๋๋ค์ด ํจ๊ป ๋์๊ฐ๋๋ค.
๊ฐ ์๊ณ๋ 12์, 3์, 6์, 9์ ๋ฐฉํฅ ์ค์ ํ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํค๊ณ ์์ต๋๋ค. ๊ฐ ์๊ณ์ ์๊ณ๋ฐ๋์ ์ ์ ํ ์กฐ์ํ์ฌ ๋ชจ๋ ์๊ณ๋ฐ๋์ด 12์ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํค๋ฉด ํผ์ฆ์ด ํด๊ฒฐ๋์ด ์ฑ๊ถค๋ฅผ ๋ด์ธํ๊ณ ์๋ ์ ๊ธ์ฅ์น๊ฐ ์ด๋ฆด ๊ฒ์ ๋๋ค.
๋
ธํํ๋ ํผ์ฆ ๊ธฐ๊ณ์ฅ์น๊ฐ ๊ฑฑ์ ๋์๋ ํ์ ์ ๊ฐ๋ฅํ ์ต์ํ์ ์กฐ์์ผ๋ก ํผ์ฆ์ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค. ์๊ณ๋ฐ๋๋ค์ ํ๋ ฌ clockHands
๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ํผ์ฆ์ ํด๊ฒฐํ๊ธฐ ์ํ ์ต์ํ์ ์กฐ์ ํ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- 2 โค
clockHands
์ ๊ธธ์ด โค 8 clockHands
๋ 2์ฐจ์ ๋ฐฐ์ด์ด๋ฉฐ ํ๊ณผ ์ด์ ํฌ๊ธฐ๊ฐ ๋์ผํฉ๋๋ค.- 0 โค
clockHands
์ ์์ โค 3 clockHands[i]
์ ์์๋ค์ ์๊ณ๋ฐ๋์ ๋ฐฉํฅ์ ๋ํ๋ด๋ฉฐ 0์ 12์ ๋ฐฉํฅ, 1์ 3์ ๋ฐฉํฅ, 2๋ 6์ ๋ฐฉํฅ, 3์ 9์ ๋ฐฉํฅ์ ๋ํ๋ ๋๋ค.- ํด๊ฒฐ ๊ฐ๋ฅํ ํผ์ฆ๋ง ์ฃผ์ด์ง๋๋ค.
์ ์ถ๋ ฅ ์
clockHands | result |
---|---|
[[0,3,3,0],[3,2,2,3],[0,3,2,0],[0,3,3,3]] | 3 |
- ์์ #1
2ํ 2์ด์ ์๊ณ๋ฐ๋, 2ํ 3์ด์ ์๊ณ๋ฐ๋, 4ํ 3์ด์ ์๊ณ๋ฐ๋์ ๊ฐ๊ฐ ํ ๋ฒ์ฉ ๋๋ฆฌ๋ฉด ์ต์ ์กฐ์ ํ์๋ก ํผ์ฆ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ด ๊ณผ์ - ์๋ 1 : ํ(?) ์์ ํ์ (์คํจ)
์ฒ์์๋ ๋จ์ํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์
ํด์ ๊ฐ์ฅ ๋ฎ์ ํ์๋ฅผ ๊ตฌํ๋ ์์ ํ์์ ํ์ด๋ก ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์์ต๋๋ค. ๊ทธ๋์ ๋จผ์ ์ด ๋ฐฉ์์ผ๋ก ํ์ด๋ณด๋ ์ผ ๋ ์๊ฐ ์ด๊ณผ๊ฐ, ์ผ ๋๋ ์์ signal: aborted (core dumped)
์ค๋ฅ๊ฐ ๋ฐ์ํด ์คํจํ์ต๋๋ค. ๊ฒ์ํด๋ณด๋ ํด๋น ์ค๋ฅ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ์ต๋ ํฌ๊ธฐ์ธ ์ ์ด๊ณผํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค๋ ๋ต๋ณ์ด ์์์ต๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ฑ๋ ๋ฌธ์ ์ ํจ์
const createAllCases = (count, arr = [], acc = []) => {
if (arr.length == count * count) {
const result = [];
for (let i = 0; i < count; ++i) {
result.push(arr.slice(i * count, (i + 1) * count));
}
acc.push(result);
return;
}
for (let i = 0; i < 4; ++i) {
arr.push(i);
createAllCases(count, arr, acc);
arr.pop();
}
return acc;
};
์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ด์ ๊ฐ ๊ถ๊ธํด ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด๋ณด๋ ํ๋ ฌ์ 0~3๋ฅผ ๋์ ํ๋ ๊ฒฝ์ฐ์ ์๋ ๋ฌด๋ ค ์ผ๋ก, โ์ ๋ณด๊ธฐ๋งํด๋ n์ด ์กฐ๊ธ๋ง ์ปค์ ธ๋ ๋๋ฆฌ ๋๊ฒ ๋คโฆโ ์ถ์์ต๋๋ค. ์ง์ ๊ณ์ฐ์ ํด๋ด๋ ์ ์ถ๋ ฅ ์์ ๊ฐ์ด ์ ์์ ํ๋ ฌ์์๋ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๊ณ , ์ต๋ ํฌ๊ธฐ์ธ ์ ๊ฒฝ์ฐ ๋ก ๋ฌด๋ ค 39์๋ฆฌ์ ์ฝ๊ธฐ๋ ํ๋ ๊ธด ์๊ฐ ๋์์ต๋๋ค. ๋ฌธ์ ์ ์ ๋ ฅ ๋ฒ์์ ํ์ด์ ์คํ ์๊ฐ์ ๋ฏธ๋ฆฌ ์๊ฐํด๋ณด์ง ์์ ์ ์ค์์์ต๋๋คโฆ
- ๐คฏ
- ์ฌ์ง์ด ์ฌ๊ท ํจ์๋ก ๊ตฌํํ๊ณ , ํจ์์ ํธ์ถ์ด๋ ๋ก์ง ๋ฑ์ ๋ชจ๋ ๋ถ๋ถ์ ๋ฌด์ํ๋๋ผ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค ๋ ๋ง๋ค ์ ํ๋ ฌ์ ๋ณต์ฌํด์ผํ๋ค๋ ๊ธฐ๋ณธ ์ ์ ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ณด๋ค ๋ํ ์ฐ์ฐ ํ์๊ฐ ํ์ํ ์ ์ด์ฃ โฆ
ํ์ด ๊ณผ์ - ์๋ 2 : ์ฒซ ์ค๋ง ์์ ํ์ (์ฑ๊ณต)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง์ ์ํ์ฐฉ์ค ๋์ ๋ฌธ์ ์์ ์ฐพ์ ์ ์๋ ์ฌ๋ฌ ๊ท์น์ ์ ๋ฆฌํ๊ณ ๊ฒฝ์ฐ์ ์๋ฅผ ์ค์ฌ๋ณด์์ต๋๋ค.
- ์๊ณ๋ฐ๋์ ํ์ ์ํค๋ ์์๊ฐ ๋ฐ๋์ด๋ ๊ฐ ์๊ณ๋ฐ๋์ ํ์ ์๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํฉ๋๋ค
- ์ ์๊ณ๋ฐ๋์ด ํ์ ํ๋ฉด ์ ์๊ณ๋ฐ๋๋ ํ์ ํฉ๋๋ค
1๋ฒ ์กฐ๊ฑด์ ์ด์ฉํด ๊ฒฝ์ฐ์ ์ ํ์์ ํ ์ด์ฉ ์ฐจ๋ก๋๋ก ์งํํ๊ธฐ๋ก ์ ํ์ต๋๋ค ์ด๋ ๊ฒ ํ ์ด์ฉ ์ฐจ๋ก๋๋ก ์งํํ ๊ฒฝ์ฐ ์ด์ ํ์์ด ๋๋๋ฉด ์ด์ ์๊ณ๋ฐ๋์ ์์ ํ ์ ์๋ ๊ฒ์ ์ด์ ๊ฐ์ ํ์ ์๊ณ๋ฐ๋ ๋ฟ์ ๋๋ค ๋ฐ๋ผ์ ์ด์์ ์ด์ ํ์ 0์ผ๋ก ๋ง๋ค์ง ๋ชปํ๋ ํ์ ๊ฐ์ ์๋ตํด๋ ๋ฉ๋๋ค.
์ต์ข ๋ฌธ์ ํ์ด ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค.
- ์ฒซ์งธ ์ด์ ๋ค์ด๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค :
- ๋ณต์ฌํ ํ๋ ฌ์ ๋์์ผ๋ก ๋๋จธ์ง ์ด์ ๋ค์ด๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค :
์ ๋ฐฉ์๋๋ก ์งํํ ๊ฒฝ์ฐ ํ์ํ ๊ฒฝ์ฐ์ ์๋ ์ ๋๋ค.
- ๐
๊ฐ์ ๋ ์ฝ๋ ์ ๋ฌธ
//2์ฐจ์ ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํ๋ ํจ์
const deepcopy = (arr) => arr.map((v) => v.slice());
//์ฃผ์ด์ง clockHands์ [x, y]์ ์ธ์ ํ ์๊ณ๋ฐ๋์ ํ์ ์ํค๋ ํจ์
const rotateHand = (x, y, clockHands, rotate) => {
//์ญ์ ํํ๋ก ํ์ํ๊ธฐ ์ํ x, y ๋ฐฉํฅ ๊ฐ
const dx = [0, -1, 1, 0, 0];
const dy = [0, 0, 0, -1, 1];
for (let i = 0; i < 5; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (clockHands[ny] !== undefined && clockHands[ny][nx] !== undefined) {
clockHands[ny][nx] = (clockHands[ny][nx] + rotate) % 4;
}
}
};
//์ฒซ์งธ ์ด์ ๋ํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์์ฑํ๋ ํจ์ (4 ** n ๊ฐ)
//๋น ๋ฅธ ์์ฑ์ ์ํด ์บ์ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค
//spead ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ํญ์ ์ ๋ฐฐ์ด์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ deepcopy๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค.
const caseCache = [, [[0], [1], [2], [3]]];
const createFirstRowCases = (count) => {
const results = [];
for (let i = 0; i < 4; ++i) {
const permutations = caseCache[count - 1] ?? createFirstRowCases(count - 1);
const attached = permutations.map((permutation) => [i, ...permutation]);
results.push(...attached);
}
return (caseCache[count] = results);
};
//๋๋จธ์ง ์ด์ ๋ฐ๋ก ์ ์ด์ ๊ธฐ์ค์ผ๋ก ํ์ ์ํค๊ณ ์ฑ๊ณต ์ ์๋ ํ์๋ฅผ ๋ฐํํ๋ ํจ์
const tryOtherRows = (clockHands, count) => {
const length = clockHands.length;
for (let y = 1; y < length; ++y) {
for (let x = 0; x < length; ++x) {
const rotate = 4 - clockHands[y - 1][x];
if (rotate === 4) {
continue;
}
rotateHand(x, y, clockHands, rotate);
count += rotate;
}
}
if (clockHands[length - 1].every((el) => el === 0)) {
return count;
}
return null;
};
function solution(originClockHands) {
const length = originClockHands.length;
let answer = Number.MAX_SAFE_INTEGER;
createFirstRowCases(length).forEach((firstRow) => {
let count = 0;
const clockHands = deepcopy(originClockHands);
firstRow.forEach((rotate, x) => {
rotateHand(x, 0, clockHands, rotate);
count += rotate;
});
count = tryOtherRows(clockHands, count);
if (count !== null) {
answer = Math.min(answer, count);
}
});
return answer;
}