inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[Java/Java] Thuật toán DFS mà ngay cả sinh viên giáo dục khai phóng cũng có thể hiểu được! - Giới thiệu

Trang trí sàn nhà (Baekjun 1388)

answer++ 위치 질문

Đã giải quyết

254

beomth

12 câu hỏi đã được viết

1

// 1. dfs 실행
		int answer = 0;
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= M; j++) {
				if(visited[i][j] == false)
					dfs(i, j);
					answer++;
			}
		}

안녕하세요.

dfs문을 호출한 이후에 answer++;를 했을 때는, 주어진 값과 다르게 나오는데, 어떤 부분에서 차이가 있는지 궁금합니다.. 감사합니다!

java 코딩-테스트 알고리즘 dfs

Câu trả lời 1

1

gaebaljob

버럼님 안녕하세요!

위에서 문제가 발생하는 이유는 if문에 해당하는 중괄호를 사용하지 않았기 때문입니다! 아래 두 가지 코드를 비교해보면서 설명 해볼게요!

// 1안
// 1. dfs 실행
int answer = 0;
for(int i = 1; i <= N; i++) {
    for(int j = 1; j <= M; j++) {
        if(visited[i][j] == false)
	    dfs(i, j);
	    answer++;
    }
}

// 2안
// 1. dfs 실행
int answer = 0;
for(int i = 1; i <= N; i++) {
    for(int j = 1; j <= M; j++) {
        if(visited[i][j] == false){
	    dfs(i, j);
	    answer++;
        }
    }
}

 

겉보기에 1안과 2안은 매우 유사하지만 완전히 다른 동작을 합니다. 1안은 버럼님이 작성하신 코드이고, 2안은 버럼님이 의도하셨던 코드 일텐데, 그 차이는 "if문의 조건에 따라 수행되는 코드의 범위"에 있습니다. 1안 같은 경우에는 if문에 중괄호를 생략했고, 이런 경우 바로 다음 코드 한 줄만 if문에 종속됩니다. 그러므로 의도했던 대로 "visited[i][j] == false 인 경우 dfs를 1회 수행하고 answer를 증가 시킨다"라고 수행되는 것이 아니고 "visited[i][j] == false 인 경우 dfs를 1회 수행한다"라고 수행되는 거죠. 그런 뒤에 answer++은 아무런 조건 없이 매 반복문마다 수행이 되기 때문에 1안에 종료된 다음에 answer는 항상 N*M의 값을 갖고 있게 될 것입니다.

일종의 눈속임처럼 줄 바꿈/띄어쓰기 때문에 같은 조건문에 묶일 것 같지만, 실제로는 1안과 아래 코드가 동일한 겁니다.

// 3안 (== 1안)
// 1. dfs 실행
int answer = 0;
for(int i = 1; i <= N; i++) {
    for(int j = 1; j <= M; j++) {
        if(visited[i][j] == false) dfs(i, j);
	answer++;
    }
}

 

그에 비해 2안은 중괄호를 명확하게 사용했기 때문에 우리가 원하는 조건이 발생하면 dfs와 answer를 모두 수행하게 됩니다.

 

그래서 정리를 하자면, 중괄호를 되도록 생략하지 않는 것이 무조건 안전합니다! 코딩이 손에 좀 익고, 코딩 테스트에서는 시간을 아끼기 위해서 혹은 코드를 간결하게 짜기 위해서 생략하는 경우도 있지만, 큰 차이가 나지 않기도 하고 한번 실수하면 찾아내기 정말 어려운 버그이기도 합니다. 그러니 앞으로는 모든 반복문, 조건문에 중괄호를 사용하시는 걸 추천 드립니다! :)

또 궁금한 점 있으면 알려주세요! 오늘도 공부 화이팅입니다 :)

dfs 부문을 이렇게 작성해도 되나요?

1

71

1

x랑 y를 거꾸로 쓰는 개념이 너무 헷갈립니다...

1

94

2

dfs 파라미터에 count를 넣는이유

1

62

2

graph 채울때 for문 설계 질문

1

71

2

질문있습니다.

1

71

1

다른 강의 언제나오나용?

1

92

2

노드간 거리 계산

1

145

1

안녕하세요, 혹시 다른문제도 여쭤볼 수 있을까요?

1

130

1

최근에 올린 질문, 코드블럭으로 공유드립니다!

1

143

1

질문이 있습니다. dfs 메서드에 order를 이렇게 구현하면 안되는 이유가 무엇인가요?

0

133

2

깊이우선탐색2 백준 24480 수업노트에...

1

115

1

백준 24479 문제 제출 결과 "틀렸습니다" 라고만 나와서 어떤 부분이 틀렸는지 잘 모르겠어요 피드백 부탁드립니다

1

249

3

graph 만들때 boolean[][] 으로 만드는 경우랑 int[][] 나 ArrayList<Integer>[] 로 만드는 기준이 어떻게 되나요?

1

201

2

graph를 2차원 배열 또는 List로 하는 기준을 어떤식으로 잡으면 좋을까요...?

1

224

1

강사님 안녕하세요! 깊이 우선 탐색 2 (백준 24480)에서 제공하는 풀이 코드에서 궁금한 점이 있어서 질문 드립니다!

1

325

3

촌수 계산

1

354

3

연결 요소의 개수 (백준 11724)

1

267

1

백준 24479 문제 시간 초과 질문 드려요

1

382

1

백준 실행시 틀립니다.

1

372

1

재귀대신 스택으로 구현하면 안될까요?

1

408

1

dfs 매개변수에서 y,x 를 왜 순서를 반대로 쓰셨는지 궁금합니다.

1

370

1

안녕하세요 11724번 질문드려요!

2

313

1

출력할 때 BufferedWriter? StringBuilder?

1

508

1

code의 어디가 잘못된지 도저히 모르겠습니다..

1

269

1