inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-E와 분할정복(Divide & Conquer)

2-E 재귀함수 범위관련 질문 있습니다

해결된 질문

302

요가인

작성한 질문수 35

1

안녕허세요 강사님

강사님 풀이 과정을 3번 이상 듣고 코드를 여러번 봤는데도 잘 이해가 안가는 부분이 있어서 질문드립니다!

 

강사님 코드기준(해설집) 11번째줄과 12번째줄에

for(int i = y; i < y + size; i++){
        for(int j = x; j < x + size; j++){

이렇게 i 와 j 의 범위를 나누셨는데

왜 y가 0 일때 모든 x 값 비교하고 재귀하고

이런식으로 만든 이유가 궁금해서 질문합니다.

 

왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 이렇게 한 묶음으로 검사를 하고 그 값을 return 하고 해야 맞지 않나요 ?

제가 풀었던 범위 나누기와 달라서 너무 헷갈려서 질문합니다.

 

 #include <iostream>
using namespace std;

// 좌상 우상 좌하 우하
const int dy[4] = { -1, -1, 0, 0 };
const int dx[4] = { -1, 0, -1, 0 };

int N;
char adj[65][65];
string ret;

string QuardTree(int y, int x, int n)
{
	string str;

	if (n == 1)
		return str += adj[y][x];

	n = n >> 1;					// n -> 2
	for (int i = 0; i < 4; i++)
	{
		int ny = y + dy[i] * n;	// 2 --> 1
		int nx = x + dx[i] * n;
		str += QuardTree(ny, nx, n);
	}

	if (str == "0000")
		str = "0";
	else if (str == "1111")
		str = "1";
	else
		str = "(" + str + ")";

	return str;
}


int main()
{
	cin >> N;

	for (int y = 1; y <= N; y++)
	{
		string temp;
		cin >> temp;
		for (int x = 1; x <= temp.size(); x++)
			adj[y][x] = temp[x - 1];
	}

	ret += QuardTree(N, N, N);

	cout << ret;
	
	return 0;
}

혹시 질문이 이해가 안가실까봐 제 코드 풀이도 올려요

c++ 코딩-테스트

답변 1

0

큰돌

안녕하세요 가인님 ㅎㅎ

왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 이렇게 한 묶음으로 검사를 하고 그 값을 return 하고 해야 맞지 않나요 ?

>>

    for(int i = y; i < y + size; i++){
        for(int j = x; j < x + size; j++){ 
            if(b != a[i][j]){ 
                ret += '(';
                ret += quard(y, x, size / 2); 
                ret += quard(y, x + size / 2, size / 2);
                ret += quard(y + size / 2, x, size / 2);
                ret += quard(y + size / 2, x + size / 2, size / 2); 
                ret += ')';
                return ret;  

사실 제가 한 코드가 그런 의미입니다. 왼위, 오위 등을 나눠서 검사하고 해당 값을 더해서 return 하고 있습니다.

    for(int i = y; i < y + size; i++){
        for(int j = x; j < x + size; j++){ 

물론, 해당 함수마다 왼위, 오위, 오아 등의 범위를 정해서 해도 되지만 저렇게 하나의 꼭지점, 왼위를 기반으로 잡는게 더 쉽기 때문에 저렇게 한 것입니다.

그리고 가인님 코드리뷰를 좀 하자면

string QuardTree(int y, int x, int n)
{
	string str;

	if (n == 1)
		return str += adj[y][x];

str이 지역변수로 선언되었는데 이렇게 되면 str에 쓰레기값이 들어갈 수 있습니다.

string str = "";

로 할당하셔야 합니다.

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

4 - A

0

10

1

코딩살구클럽 입장이 안됩니다

0

49

2

4-F 경우의 수 질문입니다.

0

30

2

코딩살구클럽 가입이 안됩니다.

0

64

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

53

1

교안 158페이지 문의드립니다

0

44

2

코딩살구클럽 관련 건의사항

0

107

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

44

1

진행 방법 질문드립니다!

0

78

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

63

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

309

2

백준 서비스 종료

9

943

1

sk 하이닉스 코테 대비

0

382

2

3-G 최댓값 질문

0

54

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

68

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

180

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

71

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

53

2