📌 문제
10709번: 기상캐스터
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시
www.acmicpc.net
JOI시는 남북방향이 H 킬로미터, 동서방향이 W 킬로미터인 직사각형 모양이다. JOI시는 가로와 세로의 길이가 1킬로미터인 H × W 개의 작은 구역들로 나뉘어 있다. 북쪽으로부터 i 번째, 서쪽으로부터 j 번째에 있는 구역을 (i, j) 로 표시한다.
각 구역의 하늘에는 구름이 있을 수도, 없을 수도 있다. 모든 구름은 1분이 지날 때마다 1킬로미터씩 동쪽으로 이동한다. 오늘은 날씨가 정말 좋기 때문에 JOI시의 외부에서 구름이 이동해 오는 경우는 없다.
지금 각 구역의 하늘에 구름이 있는지 없는지를 알고 있다. 기상청에서 일하고 있는 여러분은 각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 예측하는 일을 맡았다.
각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 구하여라.
📌 입력
입력은 1 + H 행으로 주어진다.
첫 번째 행에는 정수 H, W (1 ≦ H ≦ 100, 1 ≦ W ≦ 100) 가 공백을 사이에 주고 주어진다. 이것은 JOI시가 H × W 개의 작은 구역으로 나뉘어 있다는 것을 의미한다.
이어진 H 개의 행의 i번째 행 (1 ≦ i ≦ H) 에는 W문자의 문자열이 주어진다. W 개의 문자 중 j번째 문자 (1 ≦ j ≦ W) 는, 구역 (i, j) 에 지금 구름이 떠 있는지 아닌지를 나타낸다. 구름이 있는 경우에는 영어 소문자 'c' 가, 구름이 없는 경우에는 문자 '.' 가 주어진다.
📌 출력
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시한다. 단, 처음부터 구역 (i, j) 에 구름이 떠 있었던 경우에는 0을, 몇 분이 지나도 구름이 뜨지 않을 경우에는 -1을 출력한다.
📌 예제 입출력
📌 풀이
구할 것
- 구름의 이동시간을 우선 0으로 초기화 한다.
- 이중 for문으로 city를 순회할 때
- "c", 즉 현재 위치가 구름이라면?
- 구름이 떠 있었던 경우는 0을 출력해야 하니 answer에 0을 더해준다.
- 이 다음에 있을 도로와의 거리를 계산하기 위해 time을 1로 초기화 한다.
- 만약 c..c로 c.. 까지 갔을 때 앞에 또 새로운 구름을 발견하면, 거기서부터는 누적된 거리가 아니라 새로운 c(2번째 c) 기준으로 카운트해야 하기 때문에 time을 1로 초기화 해야 한다.
- 현재 위치가 구름이 아니라면
- 현재 위치가 구름이 아닐 때, 현재 위치 이전까지 구름이 없다면 (time이 1로 초기화되지 않고 그대로 0일 때) 앞으로도 구름이 올 일이 없기 때문에 해당 부분은 answer += "-1 "을 추가한다.
- 현재 위치가 구름이 아닐 때, 현재 위치 이전에 구름이 있다면 (time !== 0) 그 시간만큼 answer에 더해주고 다음을 위해 시간을 1 증가시킨다.
- 한 행의 하늘이 끝나면 줄바꿈을 해야 해서 answer += '\n'을 해준다. 이러면 이전까지 answer에 추가한 우측 공백 중 마지막 공백은 영향을 주지 않는다. (trim을 쓰든 안 쓰든 상관 없어짐)
- "c", 즉 현재 위치가 구름이라면?
const fs = require("fs");
const input = fs.readFileSync("./dev_stdin.txt").toString().trim().split("\n");
const [h, w] = input.shift().split(" ").map(Number);
const city = input.map((v) => v.split(""));
let answer = "";
for (let i = 0; i < h; i++) {
// 구름의 이동 시간
let time = 0;
for (let j = 0; j < w; j++) {
// 현재 위치가 구름이면 다음부터 거리가 1 증가하므로 time = 1로 초기화
// 구름이 떠있던 경우는 0이므로 answer에 0 추가
if (city[i][j] === "c") {
time = 1;
answer += "0 ";
} else {
// 현재 위치가 구름이 아닐 때 구름이 이동한 게 없다면 구름이 뜰 게 없다는 뜻
if (time === 0) {
answer += "-1 ";
} else {
// 현재 위치가 구름이 아닐 때 구름이 이동한 시간이 있다면 그 시간만큼 이동
// 이 다음을 위해 time++
answer += `${time} `;
time++;
}
}
}
// 정답 출력 시 한 행 끝나면 줄바꿈 (trim 하지 않아도 됨)
answer += "\n";
}
console.log(answer);
반복문을 생각 없이 쓰고 초기화를 다른 곳에서 하면 이상한 답이 나온다...
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 백준 코딩테스트 7568. 실버 5 : 덩치 (0) | 2023.07.25 |
---|---|
[JavaScript] 백준 코딩테스트 1193. 실버 5 : 분수 찾기 (0) | 2023.07.24 |
[JavaScript] 백준 코딩테스트 1417. 실버 5 : 국회의원 선거 (0) | 2023.07.20 |
[JavaScript] 백준 코딩테스트 16506. 실버 5 : CPU (0) | 2023.07.19 |
[JavaScript] 백준 코딩테스트 10810. 브론즈 3 : 공 넣기 (0) | 2023.07.18 |