[Programmers] Lv2. ν˜Όμžμ„œ ν•˜λŠ” 틱택토 | C++

2023. 7. 5. 20:05ㆍCoding Test/Programmers

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ‘¨‍πŸ’»ν’€μ΄ κ³Όμ •

 

3 X 3 λ§΅μ—μ„œ λ¨Όμ € κ°€λ‘œ ν˜Ήμ€ μ„Έλ‘œ ν˜Ήμ€ λŒ€κ°μ„  3개의 라인을 λ§Œλ“œλŠ” μ‚¬λžŒμ΄ μ΄κΈ°λŠ” κ²Œμž„μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μ΄κ²ΌλŠ”κ°€ μ‘ŒλŠ”κ°€λ₯Ό λ³΄λŠ” 것이 μ•„λ‹ˆλΌ, μ˜¬λ°”λ₯΄κ²Œ κ²Œμž„μ„ μ§„ν–‰ν–ˆλŠ”κ°€λ₯Ό λ³΄λŠ” κ²ƒμ΄λ―€λ‘œ λ‹€μŒκ³Ό 같은 사항듀을 체크해야 ν•©λ‹ˆλ‹€.

 

  • λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ 진행해야 ν•˜λŠ”λ°, μ–΄λŠ ν•œ μͺ½μ΄ 2번 연속 μ§„ν–‰ν•œ 경우 ( | 'O'의 개수 - 'X'의 개수| > 1)
  • 선곡이 λ¨Όμ € 놔야 ν•˜λŠ”λ°, 후곡이 λ¨Όμ € 놓은 경우 ( 'O'의 개수 < 'X'의 개수 )
  • λ‘˜ λ‹€ 이겼닀고 νŒμ •ν•  경우 ( 'O' 3개둜 ν•œ 라인을 λ§Œλ“€κ³ , 'X' 3κ°œλ‘œλ„ ν•œ 라인을 λ§Œλ“  경우)
  • 선곡이 μ΄κ²Όμ§€λ§Œ, 후곡이 계속 이어 λ‚˜κ°€λŠ” 경우 ( 'O'의 개수 - 'X'의 개수 <= 0)
    • 정상적인 κ²Œμž„μ—μ„œ 선곡이 이겼을 κ²½μš°μ—λŠ” 'O'κ°€ 'X'보닀 1κ°œκ°€ 더 λ§Žλ‹€.
  • 후곡이 μ΄κ²Όμ§€λ§Œ, 선곡이 계속 μ΄μ–΄λ‚˜κ°€λŠ” 경우 ( 'O'의 개수 == 'X'의 개수)
    • 정상적인 κ²Œμž„μ—μ„œ 후곡이 이겼을 κ²½μš°μ—λŠ” 'O'와 'X'의 κ°œμˆ˜κ°€ κ°™λ‹€.

 

μœ„μ™€ 같은 사항듀 쀑 ν•˜λ‚˜λΌλ„ ν•΄λ‹Ήλœλ‹€λ©΄ κ·Έ κ²Œμž„μ€ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ κ²Œμž„μ΄λ―€λ‘œ 0을 리턴해야 ν•©λ‹ˆλ‹€. μœ„ 사항듀을 보면 'O'와 'X'의 개수둜만 νŒλ‹¨ν•  수 μžˆλŠ” ν•­λͺ©λ“€λ„ μžˆμ§€λ§Œ, 선곡이 μ΄κ²ΌλŠ”κ°€μ™€ 후곡이 μ΄κ²ΌλŠ”κ°€μ— λŒ€ν•΄μ„œλŠ” 3개의 점이 이어진 라인인지λ₯Ό μ²΄ν¬ν•˜λŠ” 둜직이 ν•„μš”ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, κ·Έ 뢀뢄을 μž‘μ„±ν•œ ν›„ μœ„ 쑰건듀을 잘 체크해주면 λ©λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <string>
#include <vector>
using namespace std;
using Position = pair<int, int>;
const int BOARD_LENGTH = 3;
// 쒌우, μƒν•˜, y=-x λŒ€κ°λΌμΈ, y=x λŒ€κ°λΌμΈ
vector<vector<Position>> positionDirections { {{0, -1}, { 0, 1 }}, { {-1, 0}, { 1, 0} }, { {-1, -1}, { 1, 1} }, { {1, -1}, {-1, 1} } };

pair<vector<Position>, vector<Position>> GetPositions(const vector<string>& board) {
	vector<Position> firster;
	vector<Position> seconder;

	for (int row = 0; row < BOARD_LENGTH; row++) {
		for (int col = 0; col < BOARD_LENGTH; col++) {
			if (board[row][col] == 'O')
				firster.emplace_back(row, col);
			else if (board[row][col] == 'X')
				seconder.emplace_back(row, col);
		}
	}
	return make_pair(firster, seconder);
}

bool IsWin(const vector<string>& board, const vector<Position>& positions, char target) {
	for (const auto position : positions) {
		int currentRow = position.first;
		int currentCol = position.second;

		for (const auto& directions : positionDirections) {
			bool isWin = true;

			for (const auto& direction : directions) {
				int nextRow = currentRow + direction.first;
				int nextCol = currentCol + direction.second;

				if (nextRow < 0 or nextRow >= BOARD_LENGTH or nextCol < 0 or nextCol >= BOARD_LENGTH or board[nextRow][nextCol] != target)
					isWin = false;
			}

			if (isWin)
				return true;
		}
	}

	return false;
}

int solution(vector<string> board) {
	auto positions = GetPositions(board);
	vector<Position> firster = positions.first;
	vector<Position> seconder = positions.second;

	if (abs((int)firster.size() - (int)seconder.size()) > 1)
		return false;

	if (firster.size() < seconder.size())
		return false;

	bool isFirsterWin = IsWin(board, firster, 'O');
	bool isSeconderWin = IsWin(board, seconder, 'X');

	if (isFirsterWin and isSeconderWin)
		return false;

	if (isFirsterWin and firster.size() - seconder.size() <= 0)
		return false;

	if (isSeconderWin and firster.size() != seconder.size())
		return false;

	return true;
}

 

 

728x90
λ°˜μ‘ν˜•