인프런 커뮤니티 질문&답변

16wjdekdms님의 프로필 이미지
16wjdekdms

작성한 질문수

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

5-Y

17822 질문있습니다.

작성

·

17

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

설명하신 것과 비슷하게 코드를 작성을 했고 테스트 케이스도 통과를 해서 제출을 했더니 그냥 광탈을 하네요...

일단 강의 보고 제출을 했지만 왜 이 코드가 틀렸는지 모르겠어서 질문드립니다..

실수를 한건지 그냥 논리 자체가 틀린건지 모르겠네요.. 무식한 질문인 거 알지만 너무 모르겠어서 질문드립니다ㅜㅜ

#include <bits/stdc++.h>
using namespace std;

int N, M, T, ret, x, d, k;
int ty, tx;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
int a[54][54], visited[54][54];

void rotate(int* arr, int n) {
	int temp[54] = { 0 };
	for (int i = 0; i < M; i++) {
		temp[(i + n) % M] = arr[i];
	}
	
	memcpy(arr, temp, sizeof(temp));

	return;
}

void rotate_r(int* arr, int n) {
	int temp[54] = { 0 };
	for (int i = 0; i < M; i++) {
		temp[(i - n + M) % M] = arr[i];
	}

	memcpy(arr, temp, sizeof(temp));

	return;
}

bool bfs(int sy, int sx, int num) {
	visited[sy][sx] = 1;
	queue<pair<int, int>> q;
	q.push({ sy, sx });
	bool flag = 0;

	while (q.size()) {
		tie(ty, tx) = q.front();
		q.pop();

		for (int i = 0; i < 4; i++) {
			int ny = ty + dy[i];
			int nx = tx + dx[i];

			if (ny < 0 || ny >= N ||visited[ny][nx]) continue;
			if (nx < 0 || nx >= M) {
				//인덱스를 이동해야함.. 원형이기 때문에 나가지 않음
				// 0 -> 4, 4 -> 0으로 바뀜
				if (nx < 0) {
					nx = M-1;
				}
				else if (nx >= M) {
					nx = 0;
				}

			}
			if (a[ny][nx] != num) continue;
			visited[ny][nx] = 1;
			q.push({ ny, nx });
			a[ty][tx] = 0; a[ny][nx] = 0; 
			flag = 1;
		}
	}

	return flag;
}

int main() {
	cin >> N >> M >> T;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> a[i][j];
		}
	}

	while (T--) {
		cin >> x >> d >> k;

		if (d == 0) {
			rotate(a[x - 1], k);
			while (2 * x <= N) {
				int temp = x * 2;
				rotate(a[temp - 1], k);
				x++;
			}
			
		}
		else {
			rotate_r(a[x - 1], k);
			while (2 * x <= N) {
				int temp = x * 2;
				rotate_r(a[temp - 1], k);
				x++;
			}
		}

		memset(visited, 0, sizeof(visited));
		int sum = 0; int cnt = 0;
		bool flag = 0;
		bool check = 0;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				sum += a[i][j];
				if (a[i][j] != 0) {
					cnt++;
				}
				if (!visited[i][j] && a[i][j] != 0) {
					flag = bfs(i, j, a[i][j]); //한번이라도 지운다면 
				}
				if (flag) {
					check = 1;
				}
				
				
			}
		}

		if (!check) {
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					double aver = (double)sum / (double)cnt;
					if (a[i][j] != 0 && (double)a[i][j] > aver) {
						a[i][j] = a[i][j] - 1;
					}
					else if (a[i][j] != 0 && (double)a[i][j] < aver) {
						a[i][j] = a[i][j] + 1;
					}
				}
			}
		}

		//a[0][0];
	}

	//a[0][0];

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			ret += a[i][j];
		}
	}

	cout << ret;
}

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

대략적으로 잘 짜셨는데요.

visited 부분, 합계계산 부분이 잘못된 것 같습니다. 이외에도 제가 좀 다듬어봤는데요. 참고부탁드립니다.

#include <bits/stdc++.h>
using namespace std;

int N, M, T, ret, x, d, k; 
int ty, tx;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
int a[54][54], visited[54][54];

void rotate(int* arr, int n) {
    int temp[54] = { 0 };
    for (int i = 0; i < M; i++) {
        temp[(i + n) % M] = arr[i];
    }
	memcpy(arr, temp, sizeof(temp)); 
}

void rotate_r(int* arr, int n) {
    int temp[54] = { 0 };
    for (int i = 0; i < M; i++) {
        temp[(i - n + M) % M] = arr[i];
    }
	memcpy(arr, temp, sizeof(temp)); 
}

bool bfs(int sy, int sx, int num) {
    visited[sy][sx] = 1;
    queue<pair<int, int>> q;
    q.push({ sy, sx });
    bool flag = 0;  
	while (q.size()) {
        tie(ty, tx) = q.front();
        q.pop();

        for (int i = 0; i < 4; i++) {
            int ny = ty + dy[i];
            int nx = tx + dx[i];

            if (ny < 0 || ny >= N) continue;
            if (nx < 0) nx = M - 1;
            if (nx >= M) nx = 0;
            if (visited[ny][nx]) continue;
            if (a[ny][nx] != num) continue;
            visited[ny][nx] = 1;
            q.push({ ny, nx });
			a[ty][tx] = 0; a[ny][nx] = 0;  
            flag = 1;
        }
    } 
    return flag;
}

int main() {
    cin >> N >> M >> T;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> a[i][j];
        }
    }

    while (T--) { 
        cin >> x >> d >> k;

        if (d == 0) { 
            for (int i = x; i <= N; i += x) {
                rotate(a[i - 1], k % M);
            }
        }
        else { 
            for (int i = x; i <= N; i += x) {
                rotate_r(a[i - 1], k % M);
            }
        }

        memset(visited, 0, sizeof(visited));
        bool check = 0;
        int sum = 0, cnt = 0;
 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (a[i][j] != 0) {
                    sum += a[i][j];
                    cnt++;
                }
            }
        } 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (!visited[i][j] && a[i][j] != 0) {
                    if (bfs(i, j, a[i][j])) {
                        check = true;
                    }
                }
            }
        }

        // 제거된 숫자가 없는 경우 평균 계산 후 조정
        if (!check && cnt > 0) {
            double aver = (double)sum / cnt;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (a[i][j] != 0) {
                        if (a[i][j] > aver) {
                            a[i][j]--;
                        }
                        else if (a[i][j] < aver) {
                            a[i][j]++;
                        }
                    }
                }
            }
        }
    }
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            ret += a[i][j];
        }
    }

    cout << ret << '\n';
    return 0;
}

 

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

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

감사합니다.

강사 큰돌 올림.


0

안녕하세요, 인프런 AI 인턴입니다.

16wjdekdms님께서 올려주신 코드를 검토해 보니 몇 가지 코멘트를 드릴 수 있을 것 같습니다. 먼저, 문제의 특정 설명 없이 바로 오류를 찾아나가는 것은 어려울 수 있지만, 제출 후 실패가 나오는 일반적인 원인을 짚어보겠습니다.

일반적인 문제 원인

  1. 인덱스 오류: 원형 리스트의 특성을 고려하여 인덱스를 적절히 조정하셨지만, 계산과정에서 실수가 있었을 수 있습니다. 각 조건이 올바르게 작동하는지 검증해보셔야 합니다.

  2. 논리 오류: 코드에서 평균 값을 계산하여 조정하는 부분(ex. a[i][j] = a[i][j] - 1;)에서 cnt가 0일 경우 나누기 연산에서 오류가 발생합니다. 이는 논리적 오류를 일으킬 가능성이 있습니다.

  3. 입력 오류: 입력받은 배열의 도는 배열 자체 설정 시, 목적과 다른 방향으로 설정이 이루어졌을 수 있습니다. 이를 다시 한 번 점검해보세요.

  4. 메모리 초기화 문제: visited 배열의 크기와 초기화 부분을 확인해 보세요. 필요한 경우, 초기화를 주의 깊게 관리해야 함을 잊지 마세요.

체크 포인트

  • rotaterotate_r 함수에서 배열을 돌리는 과정이 올바르게 작동하는지 출력문을 통해 검증해 보세요.

  • bfs 함수가 모든 케이스에 대해 예외 없이 작동하는지, 특히 변경 조건이 제대로 검출되고 있는지 확인하세요.

  • 평균 계산 및 나머지 배열 조정 과정에서 cnt가 0일 경우를 적절히 처리할 헉> 있는 논리적 구조인지 확인해야 합니다.

  • 전체 코드가 알고리즘의 요구사항을 완벽히 충족하는지, 단계별로 시퀀스가 논리적으로 맞는지 확인하세요.

유용한 참고 링크

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

16wjdekdms님의 프로필 이미지
16wjdekdms

작성한 질문수

질문하기