5-K 문제 틀린 로직인가요?
312
작성한 질문수 28
안녕하세요 큰돌선생님 매번 좋은강의와 코드 감사합니다
강의와 수업을 복습하며 문제를 다시 풀어보았는데요, 제 처음 풀이는 플러드 필을 사용하면 깔끔하게 풀 수 있을것 같아서 적용하여 풀어보았는데, 문제의 예제조차 통과하지 못하여 그냥 새롭게 큐를 계속 새로 만들어서 하는 방식으로 수정하여 통과하였습니다.
근데 첫번째 접근방법의 로직에서 틀린부분이 없다고 생각하는데 혹시 어디가 틀린것인지 봐주실 수 있으신가요?
새롭게 미세먼지가 퍼지는 부분을 큐에 계속 담는 방식을 사용하였습니다.
첫번째 틀린 코드
http://boj.kr/cdaa0817a0054c8aaa05db4a94fd4cc1
수정후 정답 코드
http://boj.kr/48dc28720f1840d78af14656ac682d39
답변 1
1
안녕하세요 명운님 ㅎㅎ
근데 첫번째 접근방법의 로직에서 틀린부분이 없다고 생각하는데 혹시 어디가 틀린것인지 봐주실 수 있으신가요?
>> 이문제는 한턴씩 미세먼지가 퍼져나가는 것 등을 구현해야 하는 문제인데요.
c++
void go() {
int qize = q.size();
while (qize--) {
int cnt = 0;
tie(y, x) = q.front(); q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || nx < 0 || ny >= N || nx >= M) continue;
if (a[ny][nx] == -1) continue;
cnt++;
temp[ny][nx] += a[y][x] / 5;
q.push({ny, nx});
}
temp[y][x] += a[y][x] - ((a[y][x] / 5) * cnt);
q.push({y, x});
}여기서... q push를 해서 계속해서 확산을 해야할 이유가 있나요?
문제를 보시면..
미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다.
(r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다.
인접한 방향에 공기청정기가 있거나, 칸이 없으면 그 방향으로는 확산이 일어나지 않는다.
확산되는 양은 Ar,c/5이고 소수점은 버린다. 즉, ⌊Ar,c/5⌋이다.
(r, c)에 남은 미세먼지의 양은 Ar,c - ⌊Ar,c/5⌋×(확산된 방향의 개수) 이다.
즉, 계속해서 확산이 재귀적으로 일어나지않습니다.
근데 명운님 코드를 보시면 확산발생 -> q.push -> 다시 확산발생 이게 들어가있는 코드가 아닌가요?
이부분 때문에 틀리신 것 같습니다. ㅎ
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
아 제가 다시 q.push 를 한 이유는 다음 턴때 다시 미세먼지의 위치를 파악해서 q에다가 담는 로직을 생략하기 위해 그렇게 작성하였습니다.
go() 함수에서는 qsize 를 따로 정의하여 q.push를 하여도 지금 턴에는 영향을 끼치지 않고 기존 미세먼지의 수 만큼만 돌아가기 때문에 그렇게 작성하였습니다.
혹시 제가 이해하지 못하는 부분이 어디인가요?ㅜㅠ
1
아.. 이해했습니다.저 q.size를 q.size()로 봤네요...
q.push 를 한 이유는 다음 턴때 다시 미세먼지의 위치를 파악해서 q에다가 담는 로직을 생략
>> 이로직자체가 틀린 것 같습니다. 이미 변했다? 다시 변할 가능성이 있다. = 맞습니다.
그러나.
저 코드자체가 좀 문제가 있습니다.
a, b, c이렇게 되어있으면
처음에 a
그 다음에 a, b를 합니다.
근데 그 다음이 문제인데
a, b / b, a, c 이렇게 되어버립니다.
#include <bits/stdc++.h>
void go() {
int qize = q.size();
while (qize--) {
int cnt = 0;
tie(y, x) = q.front(); q.pop();
for (int i = 0; i < 4; i++) {
...
temp[ny][nx] += a[y][x] / 5;
q.push({ny, nx});
}
temp[y][x] += a[y][x] - ((a[y][x] / 5) * cnt);
q.push({y, x});
}
memcpy(&a[0][0], &temp[0][0], sizeof(temp));
memset(&temp[0][0], 0, sizeof(temp));
a[y1][x1] = -1; a[y2][x2] = -1;
}
이 코드 자체가 지금의 y, x랑 그리고 그 다음의 ny, nx 둘다를 추가하니까요.
그래서 틀린 것 같습니다. ㅎㅎ
첫 답변이 혼란을 드려서 죄송합니다.
감사합니다.
코딩살구클럽 입장이 안됩니다
0
40
2
4-F 경우의 수 질문입니다.
0
27
2
코딩살구클럽 가입이 안됩니다.
0
57
2
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
48
1
교안 158페이지 문의드립니다
0
42
2
코딩살구클럽 관련 건의사항
0
102
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
42
1
진행 방법 질문드립니다!
0
76
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
61
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
307
2
백준 서비스 종료
9
929
1
sk 하이닉스 코테 대비
0
381
2
3-G 최댓값 질문
0
52
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
63
2
3-N 질문 있습니다.
0
68
2
학습방법
0
104
2
4-H 질문 있습니다 (코드 리뷰)
0
67
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
178
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
70
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
52
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
70
2





