inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-K와 문제의 단순화

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

356

요가인

작성한 질문수 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문으로 매번 체크하게 됩니다.

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

 

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



코딩살구클럽 문의

0

6

1

코딩살구클럽 승인

0

18

2

DP 경우의 수 설명이 이해가 되지 않습니다.

0

27

2

3-F 채점 관련 질문

0

23

1

BFS, DFS 활용이 되는 상황에서의 방향성

0

28

2

코딩살구클럽 승인

0

41

2

코딩살구클럽승인

0

33

3

코딩살구클럽 승인

0

48

2

3-D 관련 질문

0

35

2

코살구 회원가입 문의

0

43

2

코살구 로그인 문제

0

65

2

3-A 문제 풀이 관련 질문

0

53

3

2-O 질문 있습니다

0

38

2

2-T 문제에 관한 질문

0

40

2

코딩 살구 클럽 접속 및 사용방법 문의

0

61

2

안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~

0

64

2

코딩살구클럽 로그인문제

0

78

3

코딩 살구 클럽 로그인 문제

0

82

2

2-J 채점관련 질문

0

65

3

코딩 살구 클럽 Python 지원 가능 여부

0

77

1

살구클럽 아이디 없음 문제

0

76

1

1-O 코딩살구클럽 채점관련 질문

0

60

2

히든 테스트 케이스가 사라졌습니다

0

57

1

채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요

1

74

2