[백준/BOJ] 백준 15738번 : 뒤집기

2023. 10. 13. 14:32알고리즘 문제풀이

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

 

15738번: 뒤집기

첫째 줄에 배열 A의 크기 N(1 ≤ N ≤ 100,000)과 위치 K(1 ≤ K ≤ N), 연산의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째에는 배열 A에 들어있는 수가 1번째 수부터 순서대로 주어진다. 배열에 들어있는

www.acmicpc.net

 

각 연산에 따라 기존 k의 위치가 어디로 움직이는지만 확인하여 문제를 해결했다

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n, k, m;
int k_point; //k번째에 위치하던 숫자의 현재 위치

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

	cin >> n >> k >> m;
	k_point = k;

	for (int i = 0; i < n; i++) {
		int input;
		cin >> input; //입력받고 사용하지는 않음
	}

	for (int i = 0; i < m; i++) {
		int order;
		cin >> order;

		if (order > 0) { //양수일때

			if (k_point <= order) { //확인하는 숫자에 영향을 줄때

				int left = 1;
				int right = order;
				int mid = (left + right) / 2;

				if (order % 2 == 1) {

					if (k_point < mid) {
						k_point = (mid - k_point) + mid;
					}

					else if (k_point > mid) {
						k_point = mid - (k_point - mid);
					}

				}

				else {

					if (k_point <= mid) {
						k_point = (mid - k_point) + mid + 1;
					}

					else if (k_point > mid) {
						k_point = mid - (k_point - mid) + 1;
					}

				}

			}

		}

		if (order < 0) { //음수일때

			if (k_point >= n + order + 1) {//확인하는 숫자에 영향을 줄때

				int left = n + order + 1;
				int right = n;
				int mid = (left + right) / 2;

				if ((-order) % 2 == 1) {

					if (k_point < mid) {
						k_point = (mid - k_point) + mid;
					}

					else if (k_point > mid) {
						k_point = mid - (k_point - mid);
					}

				}

				else {

					if (k_point <= mid) {
						k_point = (mid - k_point) + mid + 1;
					}

					else if (k_point > mid) {
						k_point = mid - (k_point - mid) + 1;
					}

				}
			}

		}

	}

	cout << k_point;

	return 0;
}