bbangssi91   5년 전

문제를 풀다가 생각을 미처하지 못한 부분이 있어서 질문드립니다.

코드 순서는 다음과 같습니다.

  1. 우선 문제에 필요한 조건을 입력받는다
  2. isAvailable() 메소드는 인구 이동이 가능한지를 미리 검사합니다.

  -> 인구이동이 하나라도 가능한 경우면 true를 리턴, 아니면 false를 리턴합니다.

3. 가능한 경우 BFS를 사용하여 L과 R 사이의 범위에 있는 경우에만 visited 배열을 true로 만들고 확장합니다.

4. 확장을 마치면(문을 전부 열었으면), 해당index의 배열에 sum/인구수 로 나누어서 배열을 갱신한다.

5. 다시 2번으로 돌아가서 true를 리턴하면 2->3->4 를 반복하고 false를 리턴하면 while 루프를 빠져나온다.

  


여기서 제가 질문드릴 부분은 2번에 해당하는 부분의 조건처리입니다.

다음 테스트케이스의 경우에서 제가 짠 코드의 예시는 다음과 같습니다.

3 5 10
10 15 20
20 30 25
40 22 10
49번 line의 for문에서 (0,0)부터 인덱스에서 확장을 하여 
T T T
T T T
F T F  의 결과가 나왔습니다.

문제는 sum/인구수를 갱신하고 난 이후, 아직 for문이 전부 돌아간것이 아니기때문에
20 20 20
20 20 20
40 22 10 의 결과가 나오게 되고 (2,2) 에서 다시 확장을 하여

F F F
F F T
F F T 의 결과가 나오게됩니다.

결과적으로 while 루프는 1번만 돈것이 되기 때문에 결과 값 출력이 2가 나와야 하는데 1이 나오게 됩니다..
문제점이 무엇인진 알겠는데 코드를 어떻게 수정해야될지 도저히 감이 잡히질 않습니다
제가 짠 코드에서 어떻게 수정을 해야 문제를 개선할 수 있을까요ㅜㅜ 도움부탁드립니다


exponential_e   5년 전

나라를 하나씩 옮겨가며  경계가 열리는지 검사를 하셨던데, 그렇게하려면 우선 나라가 하나 돌 때 마다 플래그 값을 초기화 해주고 그에 따른 결과 또한 한번씩 더해줘야 하는게 맞다는 생각입니다.

코드를 돌려본 결과 divider, 즉 경계가 열리는 나라의 갯수가 2개 이상인경우 플래그가 참이 되어야하는데, 

플래그 값이 한번 참이 되니까 그 다음부턴 디바이더에 상관없이 계속 참의 값을 갖더라구요.

해당 입출력의 문제만 찾아보느라 맞는 코드인지는 사실 잘 모르겠습니다.

아래와 같이 고치시면 질문자님이 말씀하신 예제는 출력 2가 나옵니다.

bbangssi91   5년 전

음.. 답변자님께서 말씀하신 경우라면 while문 조건을 검사하기전에

for문 루프를 벗어나기전에 배열의 값이 갱신되어서, 불필요한 결과 값이 누적되는 문제가 발생할 거 같습니다 ㅠㅠ..

여튼 도움주셔서 감사합니다!

댓글을 작성하려면 로그인해야 합니다.