문제 링크
요약
- 문제만 꼼꼼하게 읽으면 된다.
최종
결과
- 3, 4, 7 을 무조건 포함하지 않고 2, 5, 6, 9 를 무조건 1개 이상 포함하는 숫자가 good 이다.
#define DIFF (1)
#define SAME (2)
#define INVALID (4)
class Solution {
static constexpr char mod_mask[10] = {
SAME,
SAME,
DIFF,
INVALID,
INVALID,
DIFF,
DIFF,
INVALID,
SAME,
DIFF
};
bool isGood(int k) {
char mod = 0;
while (k) {
int digit = k % 10;
mod |= mod_mask[digit];
k = (k - digit) / 10;
}
return (!(mod & INVALID) && (mod & DIFF));
}
public:
int rotatedDigits(int n) {
int cnt = 0;
for (int k = 1; k <= n; k++) {
if (isGood(k)) {
cnt++;
}
}
return cnt;
}
};- 위 코드의 디테일은
- 각 digit 에 대해 rotate 했을 때 달라지는지 (
DIFF), 같은지 (SAME), 아니면 유효하지 않은지 (INVALID) 를 bit mask 로 표현한다. 즉,DIFF는 첫번째 bit 가 1이고SAME은 두번째 bit 가 1이며INVALID는 세번째 bit 가 1이다. mod_maskarray 를 통해서 각 digit 이DIFF인지,SAME인지,INVALID인지를 table 로 만들어두었다. 이렇게 하면 불필요한 branch 를 줄일 수 있다.
- 각 digit 에 대해 rotate 했을 때 달라지는지 (
