Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 알파벳 부대 전투 승패 판정 문제 해결하기


문제 상황

두 개의 알파벳 부대가 전장에서 격돌하는 상황을 생각해 봅시다. 각 팀의 병사와 무게(전력)는 아래와 같습니다.

팀 A

병사무게
A1
B2
C3
D4

팀 B

병사무게
W1
X2
Y3
Z4

병사 외에도 전장에는 폭탄이 배치되어 있으며, 폭탄은 느낌표('!') 기호로 표시됩니다. 폭탄이 폭발하면 좌우에 인접한 병사를 제거하고, 폭탄 자체도 함께 사라집니다.

예를 들어 'A!BC'는 폭탄이 A와 B를 제거하므로 결과는 'C'가 되고, '!!CC!!'는 모든 병사가 폭탄에 인접해 있으므로 빈 문자열이 됩니다.

함수는 모든 폭탄이 폭발한 뒤 어느 팀이 승리하는지, 혹은 양 팀의 무게 합이 같아 비기는지를 판별해야 합니다.

예를 들어 함수 입력이 다음과 같다면,

입력

const str = '!WX!YZ!DC!BA!';

출력

const output = 'Tie';

출력 설명

모든 폭탄이 폭발한 후 양 팀의 남은 병사 무게 합이 동일하기 때문입니다. 실제로 위 문자열에서는 모든 병사가 폭탄에 인접해 있어 전멸하므로, 양 팀 모두 0점으로 비기게 됩니다.

풀이 코드

다음은 이 문제를 해결하는 자바스크립트 코드입니다.

const str = '!WX!YZ!DC!BA!';
const stringFight = (str) => {
    const map = {
        'D': 4, 'C': 3, 'B': 2, 'A': 1,
        'Z': -4, 'Y': -3, 'X': -2, 'W': -1
    };
    const arr = [];
    const arr1 = str.split('');
    for(let i = 0; i < str.length; i++){
        if(arr1[i-1] !== '!' && arr1[i] !== '!' && arr1[i+1] !== '!'){
            arr.push(arr1[i]);
        }
    }
    const sum = arr.reduce((a, b) => a + (map[b] ? map[b] : 0), 0);
    if(sum < 0){
        return 'Team B';
    }else if(sum > 0){
        return 'Team A';
    }else{
        return 'Tie';
    }
};
console.log(stringFight(str));

코드 설명

이 코드의 동작 원리를 단계별로 살펴보겠습니다.

  • 가중치 매핑: map 객체에서 팀 A의 병사(A~D)에는 양수 가중치를, 팀 B의 병사(W~Z)에는 음수 가중치를 부여합니다. 이렇게 하면 최종 합계의 부호만으로 승패를 판단할 수 있습니다.
  • 생존자 필터링: 문자열을 split('')으로 한 글자씩 나눈 뒤 반복문을 돌면서, 자기 자신과 좌우 인접 문자가 모두 폭탄이 아닌 경우에만 생존자 배열(arr)에 추가합니다.
  • 합산 및 판정: reduce()로 생존 병사들의 가중치를 모두 더합니다. 합이 음수면 팀 B 승리, 양수면 팀 A 승리, 0이면 무승부(Tie)를 반환합니다.

실행 결과

Tie