※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2819번 문제인 상근이의 로봇이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2819 

 

2819번: 상근이의 로봇

상근이는 새로운 로봇을 만들었다. 이 로봇의 성능을 시험하기 위해서 테스트 트랙 위에서 테스트하기로 했다. 테스트 트랙은 2차원 평면이다. 가장 처음에 로봇은 (0,0)에서 시작한다. 상근이는

www.acmicpc.net

원점과 각 조사점 사이의 거리들을 모두 합한 dist라는 숫자를 만들고, 각 움직임에 따라 멀어진 점의 수, 가까워진 수를 이분 탐색(binary search)를 통해 세면서 dist를 갱신하는 식으로 문제를 해결할 수 있다.

 

찾고자하는 index가를 확실히 하고 그에 맞게 dist를 조정하는 식을 세워주자.

글쓴이는 전체 범위를 벗어나는 -1000001과 1000001을 배열에 같이 넣는 방식으로 찾고자하는 index가 항상 존재하게끔 조절하였다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <algorithm>
#include <cassert>
using namespace std;
typedef long long ll;

int X[100002];
int Y[100002];

ll dist = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, M; cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int x, y; cin >> x >> y;
		X[i] = x, Y[i] = y;
		dist += abs(x) + abs(y);
	}
	X[N] = -1000001, X[N + 1] = 1000001;
	Y[N] = -1000001, Y[N + 1] = 1000001;
	N += 2;
	sort(X, X + N);
	sort(Y, Y + N);

	int x = 0, y = 0;
	string s; cin >> s;
	for (auto c : s) {
		if (c == 'I') { // east
			int L = 0, R = N - 1;
			while (L < R) { // L을 x보다 큰 수를 가리키는 최소 인덱스로
				int mid = (L + R) / 2;
				if (X[mid] <= x) L = mid + 1;
				else R = mid;
			}
			dist += 2 * L - N;
			cout << dist << '\n';
			x++;
		}
		else if (c == 'Z') { // west
			int L = 0, R = N - 1;
			while (L < R) { // R을 x보다 작은 수를 가리키는 최대 인덱스로
				int mid = (L + R) / 2 + 1;
				if (x <= X[mid])  R = mid - 1;
				else L = mid;
			}
			dist += (N - 2) - 2 * R;
			cout << dist << '\n';
			x--;
		}
		else if (c == 'S') { // north
			int L = 0, R = N - 1;
			while (L < R) { // L을 y보다 큰 수를 가리키는 최소 인덱스로
				int mid = (L + R) / 2;
				if (Y[mid] <= y) L = mid + 1;
				else R = mid;
			}
			dist += 2 * L - N;
			cout << dist << '\n';
			y++;
		}
		else { // south
			int L = 0, R = N - 1;
			while (L < R) { // R을 y보다 작은 수를 가리키는 최대 인덱스로
				int mid = (L + R) / 2 + 1;
				if (y <= Y[mid])  R = mid - 1;
				else L = mid;
			}
			dist += (N - 2) - 2 * R;
			cout << dist << '\n';
			y--;
		}
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1477 // C++] 휴게소 세우기  (0) 2021.11.02
[BOJ 2110 // C++] 공유기 설치  (0) 2021.11.01
[BOJ 1450 // C++] 냅색문제  (0) 2021.10.30
[BOJ 1563 // C++] 개근상  (0) 2021.10.29
[BOJ 3948 // C++] 홍준이의 친위대  (0) 2021.10.28

+ Recent posts