- 볡λμ μμ
S
μ νλΆ P
μ΄ μμ λ λ²½μ μΈμμ κ° κ³΅κ°μ μμ 2κ°κ° ν¬ν¨λλλ‘ λλλ κ²½μ°μ μλ₯Ό ꡬνλ€.
- λ¨Όμ μ λμ νλΆμ΄ μλ€λ©΄ μ μΈμν¨λ€. μ΄μ°¨νΌ μλμ μλ νλΆ μ¬μ΄μλ λ²½μ μΈμ°κΈ° μ΄λ €μ°λ―λ‘ λ―Έλ¦¬ μ μΈμν€λ©΄ λ¬Έμ λ₯Ό λ¨μν ν μ μλ€.
- μ΄λ κ² μ»μ΄μ§ μμμ
pos
κ³Ό λμ end
μ κΈ°μ€μΌλ‘ μμμ μ μμ§μ΄λ©΄μ μΉΈλ§μ΄λ₯Ό μΈμ°λ κ²½μ°μ μλ₯Ό κ³μ°νλ€. - μΉΈλ§μ΄λ μλ¦¬κ° 2κ°κ° λλ μμ λ§λ€ μΈμΈ μ μλ€.
- λ¨, μλ¦¬κ° 2κ°κ° λμ§ μμλλ° νλΆμ΄ λ±μ₯νλ€λ©΄ ν΄λΉ μμΉμλ μΉΈλ§μ΄λ₯Ό μΈμΈμ μμΌλ―λ‘ λ¬΄μνλ€.
- λ§μΌ μλ¦¬κ° 2κ°κ° λμ§ λͺ»ν μνμμ 볡λκ° λλλ€λ©΄ 곡κ°μ λλ μ μμΌλ―λ‘ κ²½μ°μ μλ μλ κ²μ΄ λλ€.
- λ§μ½ μλ¦¬κ° 2κ°κ° λλ μμ λ°λ‘ λ€μ νλΆμ΄ μλ€λ©΄ μΉΈλ§μ΄λ₯Ό μΈμΈ μ μλ€. μ΄λ κ²½μ°μ μλ 1κ° λΏμ΄λ€.
- λ§μ½μ μλ¦¬κ° 2κ°κ° λλ μμ μ΄νμ νλΆμ΄ μ‘΄μ¬νλ€λ©΄ μ°μλλ νλΆμ κ°μ + 1 λ§νΌ μΉΈλ§μ΄λ₯Ό μΈμ°λ κ²½μ°μ μκ° μκΈ΄λ€.
- μλ₯Ό λ€μ΄
SSPPSS
μ κ°μ κ²½μ° SS|PPSS
SSP|PSS
SSPP|SS
μ κ°μ΄ μΈκ°μ§ κ²½μ°μ μλ‘ μΉΈλ§μ΄λ₯Ό μΈμΈ μ μλ€.
- μ 체 κ²½μ°μ μλ μΉΈλ§μ΄λ₯Ό μΈμΈ μ μλ μ§μ λ§λ€μ κ²½μ°μ μλ₯Ό κ³±ν κ²μ΄ λλ€.
class Solution {
public:
static constexpr int MOD = 1e9 + 7;
int numberOfWays(string corridor) {
int end = corridor.length() - 1;
int pos = 0;
int seats = 0;
int plants = 0;
long long result = 1;
// skip first & last plants
while (pos <= end) {
if (corridor[pos] == 'P') ++pos;
else break;
}
while (end >= pos) {
if (corridor[end] == 'P') --end;
else break;
}
while (pos <= end) {
// count seats
seats = 0;
while (pos <= end && seats != 2) {
if (corridor[pos] == 'S') ++seats;
++pos;
}
// cannot make 2 seats, so break the loop
if (seats != 2) break;
// count plants
plants = 0;
while (pos <= end) {
if (corridor[pos] != 'P') break;
++pos; ++plants;
}
result = (result * (plants + 1)) % MOD;
}
// cannot make room with 2 seats
return seats == 2? result : 0;
}
};