반응형
1. 문제
- n x n 크기의 grid가 주어질 때, 행과 열이 같은 경우의 수를 반환하라.
2. 해결
function equalPairs(grid: number[][]): number {
const rowMap = new Map<string, number>();
const colMap = new Map<string, number>();
for (let i = 0; i < grid.length; i++) {
const row = grid[i].join(',');
const col = grid.map(r => r[i]).join(',');
rowMap.set(row, (rowMap.get(row) || 0) + 1);
colMap.set(col, (colMap.get(col) || 0) + 1);
}
let ans = 0;
for (const [str, rowCount] of rowMap) {
const colCount = colMap.get(str) || 0;
ans += rowCount * colCount;
}
return ans;
}
- 이 문제는 접근을 잘하긴 했는데, 2가지 포인트를 놓쳤다.
- row와 col의 수를 만들 때, 구분자 없이 저장했는데 이러면 [[11,1], [1, 11]]과 같이 연속된 문자열이 나타나는 경우 저장이 제대로 되지 않는다. => 별도 구분자가 필요.
- rowMap을 탐색하면서, colMap에 존재하면 rowMap에 저장되어 있는 값을 더해주며 ans를 늘려갔는데,이러면 경우의 수가 제대로 고려되지 않는다 => row에 저장된 값과 col에 저장된 값을 곱해줘야 모든 경우의 수가 나온다.
- 예를 들어, row에 2번 등장하는 패턴이 있고 col에 1번 등장한다고 할 때 [a,0] [b,0]으로 2번이 맞다.
- 근데, row와 col 모두 2번 등장하는 경우, [a,0] [a,1] [b,0] [b,1]로 4번이 되야 한다.
- 따라서 row의 가능한 수 * col의 가능한 수를 해야 한다.