inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-K와 문제의 단순화

3-K 시간초과 관련 질문있습니다!

353

요가인

작성한 질문수 35

0

안녕하세요 선생님!

2가지 질문드릴게 있습니다!

  1. 제가 만든 로직이 왜 시간초과인지 잘 모르겠고

  2. 시간초과를 어떤식으로 해결해야할지 잘 모르겠습니다...

http://boj.kr/e32a513c49c94b99b253e5daedafde8c

#include <iostream>
#include <queue>
using namespace std;

const int dy[4] = { -1,1,0,0 };
const int dx[4] = { 0,0,-1,1 };

int R, C, sy, sx, ey, ex, ret;
int visited[1501][1501];
char adj[1501][1501];
queue<pair<int, int>> q;
queue<pair<int, int>> temp;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> R >> C;

	sy = -1;

	for (int y = 0; y < R; y++)
		for (int x = 0; x < C; x++)
		{
			cin >> adj[y][x];
			if (adj[y][x] == 'L')
			{
				if (sy == -1)
				{
					sy = y;
					sx = x;
				}
				else
				{
					ey = y;
					ex = x;
				}
			}
		}

	q.push({ sy,sx });
	visited[sy][sx] = 1;

	while (true)
	{
		// 백조끼리 만나나 못만나나 확인
		while (q.size())
		{
			int y = q.front().first;
			int x = q.front().second;
			q.pop();

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

				if (ny < 0 || ny >= R || nx < 0 || nx >= C)
					continue;
				if (ny == ey && nx == ex)
				{
					cout << ret;
					return 0;
				}
				if (visited[ny][nx])
					continue;
				if (adj[ny][nx] == 'X')
					continue;

				visited[ny][nx] = visited[y][x];
				q.push({ ny,nx });
			}
		}

		// 빙판 녹이기
		for (int y = 0; y < R; y++)
			for (int x = 0; x < C; x++)
				if (adj[y][x] == 'X')
				{
					for (int i = 0; i < 4; i++)
					{
						int ny = y + dy[i];
						int nx = x + dx[i];

						if (ny < 0 || ny >= R || nx < 0 || nx >= C)
							continue;
						if (adj[ny][nx] == '.' || adj[ny][nx] == 'L')
						{
							if (visited[ny][nx] != 0)
							{
								q.push({ y,x });
								visited[y][x] = visited[ny][nx];
							}
							temp.push({ y,x });
							break;
						}
					}
				}

		while (temp.size())
		{
			adj[temp.front().first][temp.front().second] = '.';
			temp.pop();
		}

		ret++;
	}

	return 0;
}

c++ 코딩-테스트

답변 1

0

큰돌

안녕하세요 가인님 ㅎㅎ

이 문제는 특히나 시간초과가 타이트한 문제입니다.

사실 제 정답코드에서 조금이라도 불필요한 부분의 로직이 추가가 되면 시간초과가 되는 문제입니다.

 

그래서.. 불필요한 부분이 하나라도 있으면 안되는 문제인데요.

		// 빙판 녹이기
		for (int y = 0; y < R; y++)
			for (int x = 0; x < C; x++)

여기서 일단 이중 for문으로 매번 체크하게 됩니다.

얼음을 방문하면서 확인할 수 있는 부분이기 때문에 불필요합니다.

 

나머지 부분은 괜찮은 것 같습니다.



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

0

40

2

2주차 개념#12 트리 순회

0

22

2

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

0

266

2

백준 서비스 종료

9

839

1

sk 하이닉스 코테 대비

0

365

2

3-G 최댓값 질문

0

50

1

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

0

82

2

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

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

101

2

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

0

66

2

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

0

167

2

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

0

69

2

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

0

64

2

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

0

50

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

67

2

함수별 시간복잡도

0

72

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2

1-I 문제 질문 드립니다.

0

76

2

2-P 질문입니다.

0

56

1

mac에서 시작하기 관련

0

90

2

5-Q 질문

0

63

2

풀이 코드 질문

0

64

2