해결된 질문
작성
·
38
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요. 해당 정답 코드를 보며 다시 풀어보고 있는데,
구조체를 선언 하는 위치만 아래 코드 처럼 바꾸었는데 시간초과가나네요.. 원인을 모르겠습니다.
#include <bits/stdc++.h>
#define max_n 100
using namespace std;
const int dx[] = {0, 0, 1, -1 };
const int dy[] = {-1, 1, 0, 0 };
int shark[max_n][max_n], R, C, M, ret, temp[max_n][max_n];
struct Shark {
int y, x, s, dir, z, death;
}a[max_n*max_n];
답변 2
0
안녕하세요 수현님 ㅎㅎ
이부분은 배열의 크기를 잘못선언해서 -> UB가 뜨는 것 같습니다.
둘의 코드 위치는 결과적으로 상관없지만 배열의 크기 때문에 : 100을 참조할 수 있기 때문에 101이상으로 선언해야 함 -> UB -> 시간초과가 발생하는 것 같습니다.
이렇게 선언해보시겠어요?
구조체 위치를 다르게 해도 맞는 코드:
#include <bits/stdc++.h>
#define max_n 104
using namespace std;
const int dx[] = {0, 0, 1, -1 };
const int dy[] = {-1, 1, 0, 0 };
int shark[max_n][max_n], R, C, M, ret, temp[max_n][max_n];
struct Shark {
int y, x, s, dir, z, death;
}a[max_n*max_n];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> R >> C >> M;
for (int i = 1; i <= M; i++)
{
cin >> a[i].y >> a[i].x >> a[i].s >> a[i].dir >> a[i].z;
a[i].y--; a[i].x--; a[i].dir--;
if(a[i].dir <= 1) a[i].s %= (2 * (R - 1));
else a[i].s %= (2 * (C - 1));
shark[a[i].y][a[i].x] = i;
}
for (int t = 0; t < C; t++)
{
for (int y = 0; y < R; y++)
{
if (shark[y][t])
{
a[shark[y][t]].death = 1;
ret += a[shark[y][t]].z;
shark[y][t] = 0;
break;
}
}
memset(temp, 0, sizeof(temp));
for (int i = 1; i <= M; i++)
{
if (a[i].death) continue;
int y = a[i].y;
int x = a[i].x;
int s = a[i].s;
int d = a[i].dir;
int ny, nx;
while (1)
{
ny = y + s * dy[d];
nx = x + s * dx[d];
if (nx < C && ny < R && ny >= 0 && nx >= 0)break;
if(d <= 1){
if(ny < 0){
s -= y;
y = 0;
}else{
s -= R - 1 - y;
y = R - 1;
}
}else{
if(nx < 0){
s -= x;
x = 0;
}else {
s -= C - 1 - x;
x = C - 1;
}
}
d ^= 1;
}
if (temp[ny][nx])
{
if (a[temp[ny][nx]].z < a[i].z)
{
a[temp[ny][nx]].death = 1;
temp[ny][nx] = i;
}
else a[i].death = 1;
}else temp[ny][nx] = i;
a[i].y = ny;
a[i].x = nx;
a[i].dir = d;
}
memcpy(shark, temp, sizeof(temp));
}
cout << ret << "\n";
return 0;
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다. 전수현님.
구조체 선언 위치에 따른 시간초과 문제와 관련된 질문에 대해 적절한 정보를 제공할 내용을 찾았습니다. 아래에 관련된 질문을 참고해 주세요.
구조체 선언의 위치가 알고리즘의 시간 복잡도에 영향을 미치지는 않지만, 메모리 관리와 관련된 부분에서 시간이 늦춰질 수 있습니다. 예를 들어, 반복문 안에 구조체 변수를 선언하는 경우, 루프마다 메모리를 할당하고 해제하는 작업이 반복되기 때문에 시간 초과 문제가 발생할 수 있습니다. 따라서, 메모리 할당을 최소화하고 효율적으로 사용하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.