Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

게스트 출연 기록 확인 후 방 상태를 알아내는 C++ 프로그램

<시간/>

'L', 'R' 및 0에서 9까지의 숫자가 포함된 문자열 S가 있다고 가정합니다. 왼쪽에서 오른쪽으로 0에서 9까지 번호가 매겨진 10개의 객실이 있는 호텔이 있다고 가정합니다. 호텔에는 두 개의 입구가 있습니다. 하나는 왼쪽에 있고 다른 하나는 오른쪽에 있습니다. 고객이 왼쪽 입구를 통해 호텔에 도착하면 왼쪽 입구에서 가장 가까운 빈 방을 얻습니다. 마찬가지로 고객이 오른쪽 입구를 통해 호텔에 도착하면 오른쪽 입구에서 가장 가까운 빈 방을 얻습니다. 그러나 우리는 방 배정 목록을 잃어 버렸습니다. 그러나 우리는 모든 고객을 기억합니다. 고객이 언제 도착했는지, 어느 입구에서, 호텔을 떠날 때. 처음에는 호텔이 비어 있었습니다. 메모리에서 방 배정 목록을 복구해야 합니다. S에서 'L'은 왼쪽에서 온 사람을 의미하고, 'R'이면 오른쪽에서 온 사람을 의미하며, 숫자 d는 고객이 d방을 나가는 것을 나타냅니다. 방 상태를 반환해야 합니다. 길이가 10이고 0인 문자열은 공간이 비어 있음을 의미하고 그렇지 않으면 점유됩니다.

따라서 입력이 S ="LLRL1RL1"과 같으면 출력은 "1010000011"이 됩니다.

우선 모든 방이 비어 있습니다. 상태 0000000000.

L - 고객은 왼쪽 입구를 통해 호텔에 도착합니다. 상태 1000000000.

L - 왼쪽 입구의 고객. 상태 1100000000.

R - 오른쪽 입구의 고객. 상태 1100000001.

L - 왼쪽 입구의 고객. 상태 1110000001.

1 - 1번 방의 고객이 나갑니다. 상태 1010000001.

R - 오른쪽 입구의 고객. 상태 1010000011.

L - 왼쪽 입구의 고객. 상태 1110000011.

1 - 1번 방의 고객이 나갑니다. 상태 1010000011.

단계

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

n := size of S
a := "0000000000"
for initialize i := 0, when i < n, update (increase i by 1), do:
   if S[i] is same as 'L', then:
      set left most 0 in a to 1
   if S[i] is same as 'R', then:
      set right most 0 in a to 1
   Otherwise
      set S[i]th place in a to 0
return a

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;

string solve(string S) {
   int n = S.size();
   string a = "0000000000";
   for (int i = 0; i < n; i++) {
      if (S[i] == 'L')
         a[a.find('0')] = '1';
      if (S[i] == 'R')
         a[a.rfind('0')] = '1';
      else
         a[S[i] - '0'] = '0';
   }
   return a;
}
int main() {
   string S = "LLRL1RL1";
   cout << solve(S) << endl;
}

입력

"LLRL1RL1"

출력

1010000011