2311 - Longest Binary Subsequence Less Than or Equal to K
info
- 문제 보기: 2311 - Longest Binary Subsequence Less Than or Equal to K
- 소요 시간: 36분 34초
- 풀이 언어:
java
- 체감 난이도: 3️⃣~4️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
그리디
DP
풀이 코드
info
- 메모리: 41320 KB
- 시간: 1 ms
class Solution {
public int longestSubsequence(String s, int k) {
int sum = 0;
int ans = 0;
int bits = (int)(Math.log(k) / Math.log(2)) + 1;
char[] sArr = s.toCharArray();
for (int i = 0; i < sArr.length; ++i) {
char ch = sArr[sArr.length-1-i];
if (ch == '1') {
if (i < bits && sum+(1<<i) <= k) {
sum += 1<<i;
++ans;
}
}
else {
++ans;
}
}
return ans;
}
}
풀이 해설
int bits = (int)(Math.log(k) / Math.log(2)) + 1;
k
를 이진수로 표현했을 때 필요한 자리수를 상단의 공식으로 구한다.
다만 알아둘 점이라면,
자바의 로그는 자연로그이기 때문에 밑 변환 공식을 사용하여 구해야 한다.
+1을 마지막에 하는 이유는 몇 개 직접 계산해보면 알 수 있다.
자리수 계산 예
3 -> 0b11 -> 2자리
4 -> 0b100 -> 3자리
5 -> 0b101 -> 3자리
이렇듯, 이므로 +1 해줘야 한다.
나머지는 WIP 세미나 들어서 피곤함
메모
- 실전이면 안전빵으로 DP 풀이했을 것 같음... (그렇게도 풀어보라는 것)