본문 바로가기
Algorithm/🏫assignment

# 달팽이

by yewoneeee 2022. 9. 16.

# 문제

 

# 입력 및 출력

 

# 풀이

처음에 N, N-1, N-1, N-2, N-2, ... , 2, 2, 1, 1 이 값을 빼주는 작업이 시간 초과가 걸릴 것이라고 생각했다.

왜냐하면 N이 10^7으로 매우 큰 상태기 때문이다.

근데 막상 보면 N^2번 반복되는 작업이 아니고 N번 반복되는 작업이기 때문에

시간초과는 걸리지 않는다.

 

엄청 복잡하게 풀어서 알고리즘을 천천히 글로 정리해봤다.

글로 쓰고 나니까 머릿속에 정리가 되는 느낌이다.

#include <fstream>
using namespace std;

long long N;
long long dx[4] = { 0,1,0,-1 };
long long dy[4] = { 1,0,-1,0 };

ifstream fin("snail.inp");
ofstream fout("snail.out");

// K, R 찾기
pair<long long, long long> find_range(long long a) {
	long long n = N;
	long long cnt = 0; // K
	while (a >= n) {
		cnt++, a -= n;
		if (n == N) {
			n--;
			continue;
		}
		if (a < n || n <= 0) break;
		cnt++, a -= n;
		n--;
	} // R = a
	return make_pair(cnt, a); // (K, R) 리턴
}

// 실제 인덱스 찾기
pair<long long,long long> find_index(pair<long long, long long> sr) {
	pair<long long, long long> result;
	long long s = sr.first / 4; // s
	long long r = sr.first % 4; // r
	switch (r) {
		case 0:  
			result = make_pair(s + 1, s);
			break;
		case 1:
			result = make_pair(s + 1, N - s);
			break;
		case 2:
			result = make_pair(N - s, N - s);
			break;
		default:
			result = make_pair(N - s, s + 1);
			break;
	}
	// 찾고자 하는 인덱스에 도달하기 전 달팽이가 마지막으로 회전하는 위치 찾음

	for (long long i = 0; i < sr.second; i++) {
		result.first += dx[r];
		result.second += dy[r];
	}
	// 오, 아래, 왼, 위 중 정해진 방향으로 R 만큼 이동
    
	return result; // 실제 위치 리턴
}

void snail(long long A, long long B) {
	pair<long long, long long> a, b, res_a, res_b;
	a = find_range(A);
	b = find_range(B);
	res_a = find_index(a); // a의 실제 인덱스
	res_b = find_index(b); // b의 실제 인덱스
    
    // 절대값 abs 함수가 오류날 것 같아 직접 확인해줌
	long long check = ((res_a.first - res_b.first) == (res_a.second - res_b.second)) ||
		((res_a.first - res_b.first) == (-1)*(res_a.second - res_b.second)); 
    
    // 정답 출력
	if (check) fout << "YES" << "\n";
	else fout << "NO" << "\n";
}

int main() {
	int T;
	fin >> T;
	while (T--) {
		long long A, B;
		fin >> N >> A >> B;
		snail(A, B);
	}
	fin.close();
	fout.close();
}

 

 

확실히 N이 커서 그런지 시간이 오래걸리긴 했다.

그래도 꽤 복잡한 알고리즘인데 혼자 힘으로 한 번에 맞춰서 기분이 좋다.ㅎㅎ

 

내가 어렵게 푼 걸까?

'Algorithm > 🏫assignment' 카테고리의 다른 글

# 순열을 이진트리로  (0) 2022.09.23
# 격자 색칠  (0) 2022.09.18
# Interesting Gain  (0) 2022.09.11
# 계단 오르기  (0) 2022.09.09
# Spin And Slide  (0) 2022.09.04

댓글