안경잡이개발자

728x90
반응형

문제 유형: 구현

문제 URL: https://codeforces.com/contest/1075/problem/A


  N x N의 체스 판이 있을 때 (1, 1)에 '화이트 킹'이 있고, (N, N)에 '블랙 킹'이 있습니다. 각 킹은 인접한 8가지 방향의 셀 중 한 곳으로 이동할 수 있습니다. 대각선도 포함해 이동할 수 있는 것입니다. 이 때 (X, Y)의 위치에 화이트 킹과 블랙 킹 중에서 누가 더 먼저 도착할 수 있는지를 구하면 되는 문제입니다. 다만 화이트 킹이 먼저 이동하며 시작과 동시에 킹의 위치와 (X, Y)가 동일하다면 그 즉시 종료됩니다.


  이 문제는 매우 간단한 문제입니다. (1, 1)에 화이트 킹이 있으며 (N, N)에 블랙 킹이 있으므로, 두 위치에서 (X, Y) 까지의 이동 횟수를 구하면 됩니다. 횟수를 구할 때는 각 킹들이 대각선 방향으로도 이동할 수 있다는 점에서 '가로 길이와 세로 길이 중에서 더 긴 것'을 구하면 됩니다.


  이동 횟수: 가로 길이와 세로 길이 중에서 더 긴 것


  결과적으로 이동 횟수를 비교하여 정답을 출력하면 됩니다.


※ 입출력 예시 ※


input
Copy
4
2 3
output
Copy
White
input
Copy
5
3 5
output
Copy
Black
input
Copy
2
2 2
output
Copy
Black


※ 정답 소스코드 ※

(컴파일 환경: GNU G++11 5.1.0)

#include <iostream>
#include <stdio.h>

using namespace std;

int main(void) {
	long long int n;
	cin >> n;
	long long int x, y;
	cin >> x >> y;
	long long int black = max(n - x, n - y);
	long long int white = max(x - 1, y - 1);
	if(black == 0) {
		cout << "Black";
	}
	else if(white == 0) {
		cout << "White";
	}
	else if(white <= black) {
		cout << "White";
	}
	else {
		cout << "Black";
	}
	return 0;
}


728x90
반응형

728x90
반응형

문제 유형: 구현

문제 URL: https://codeforces.com/contest/915/problem/B


  브라우저에 N개의 탭이 열려 있습니다. 각 탭은 차례대로 1번부터 N번에 해당합니다. 현재 마우스 커서는 pos 번 탭에 존재하며 공부하기 위해서 l부터 r까지의 탭을 제외한 나머지 탭은 모두 꺼버리고 싶습니다. 다만 최대한 빠르게 탭을 정리하고자 합니다.


  매 초마다 커서를 왼쪽 혹은 오른쪽으로 이동할 수 있습니다. 물론 이동할 때 이미 꺼진 탭 번호로는 이동할 수 없습니다. 예를 들어 1, 2, 3번 탭을 끈 이후에 4번에서 그 왼쪽인 3번 탭으로는 이동할 수 없는 것입니다. 또한 매 초마다 탭을 끌 수 있으며, 탭을 끌 때는 현재 커서가 위치한 탭에서 왼쪽에 있는 모든 탭을 모두 끄거나 오른쪽에 있는 탭을 모두 끄는 방법이 있습니다. 현재 1부터 M까지의 탭이 켜져 있고, 현재 커서가 pos번 탭에 위치한 상태에서 l부터 r까지의 탭을 제외한 나머지 탭을 모두 끄는데 걸리는 가장 빠른 시간을 구하면 되는 문제입니다.


  이 문제는 매우 간단한 구현 문제입니다. 일단 l부터 r까지의 탭을 제외한 다른 모든 탭을 꺼야 합니다. 탭을 끌 때는 왼쪽에 있는 모든 탭을 끄거나 오른쪽에 있는 모든 탭을 끄는 방법이 있으므로 왼쪽으로 가는 경우와 오른쪽으로 가는 경우 중에서 더 빠른 경우부터 끄면 됩니다.


  답을 구하기 위해서는 가장 먼저 l이 1보다 큰지 확인하여 왼쪽에 있는 탭을 끄러 갈 필요가 있는지 확인합니다. r이 n보다 작은지 또한 고려해야 합니다. 이후에 기본적으로 오른쪽부터 끈다고 가정합니다. 결과적으로 왼쪽 탭 끄는 위치와 오른쪽 탭 끄는 위치 중에서 더 가까운 곳으로 이동하여 먼저 탭을 끈 뒤에 남은 탭으로 이동해서 끄면 됩니다.


※ 예시 입출력 ※


input
Copy
6 3 2 4
output
Copy
5
input
Copy
6 3 1 3
output
Copy
1
input
Copy
5 2 1 5
output
Copy
0


※ 정답 소스코드 ※

(컴파일 환경: GNU G++11 5.1.0)

#include <iostream> #include <algorithm> #include <math.h> using namespace std; int main(void) { int n, pos, l, r; cin >> n >> pos >> l >> r; vector<int> v; int count = 0; // 오른쪽을 꺼야 하는 경우 if(r < n) { v.push_back(1); } // 왼쪽을 꺼야 하는 경우 if(l > 1) { v.push_back(0); } // 왼쪽부터 끄는 게 더 가까운지 if(pos - l <= r - pos) { sort(v.begin(), v.end()); // 왼쪽부터 끄도록 함 } for(int i = 0; i < v.size(); i++) { int direction = v[i]; int target = -1; if(direction == 0) { target = l; } if(direction == 1) { target = r; } count += abs(pos - target) + 1; pos = target; } cout << count; return 0; }


728x90
반응형

728x90
반응형

문제 유형: 수학

문제 URL: https://codeforces.com/contest/915/problem/A


  정원은 길이가 K인 선분(Segment) 형태로 표현됩니다. 또한 N개의 그릇에 물을 담아서 농작물에 물을 주려고 합니다. i번째 그릇은 한 시간에 Ai 길이의 연속적인 공간에 물을 줄 수 있도록 해줍니다. 이 때 한 번 물을 준 곳은 더 이상 주지 않으며 주인공은 하나의 그릇을 선택하여 가능한 빠르게 농사를 짓는 전체 공간에 물을 주고자 합니다. 이 때 주인공이 가장 적은 시간으로 정원에 물을 줄 때의 시간을 구하면 됩니다.


  이 문제는 길이가 K인 전체 정원에 물을 주어야 하며 남는 공간이 없어야 하고, 한 번 물을 준 곳은 더 이상 줄 수 없다는 점에서 단순히 약수를 판별하는 문제입니다. 주어진 그릇의 크기 중에서 K의 약수로 가장 큰 것을 고르면 됩니다. 따라서 K를 해당 약수로 나눈 값을 출력하도록 하면 정답 처리를 받을 수 있습니다. 또한 항상 하나 이상의 그릇은 정원의 모든 공간에 물을 줄 수 있도록 입력이 주어진다고 합니다.


※ 예시 입출력 ※

input
Copy
3 6
2 3 5
output
Copy
2
input
Copy
6 7
1 2 3 4 5 6
output
Copy
7


※ 정답 소스코드 ※

(컴파일 환경: GNU G++11 5.1.0)

#include <iostream>
#include <limits.h>

using namespace std;

int main(void) {
	int n, k;
	cin >> n >> k;
	int res = INT_MIN;
	for(int i = 0; i < n; i++) {
		int x;
		cin >> x;
		if(k % x == 0) {
			res = max(res, x);
		}
	}
	cout << k / res;
	return 0;
}


728x90
반응형