반응형
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔺 코드
- 틀림
import java.util.*;
class Solution {
public int[] solution(String s) {
int zeroCnt = 0; // 제거할 0의 갯수
int turn = 0; // 회차
int len = 0; // 0 제거 후 길이
// 이진 변환 반복
int num = Integer.parseInt(s);
for(int i = 1 ; ; i++) {
if(Integer.bitCount(num) != s.length()) { // 0이 존재한다면
zeroCnt += s.length() - Integer.bitCount(num); // 제거할 0의 갯수 더하고
s = s.replace("0", ""); // 0 제거하기
len = s.length(); // 0 제거 후 길이
num = Integer.parseInt(Integer.toBinaryString(len)); // 이진 변환 결과
turn = i;
if(num == 1) {
break;
}
}
}
int[] answer = new int[2];
answer[0] = turn;
answer[1] = zeroCnt;
return answer;
}
}
시간 초과 에러가 떴다.
- 정답
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
while(s.length() > 1) {
int cntOne = 0; // 1 갯수 세기
for(int i = 0 ; i < s.length() ; i++) {
if(s.charAt(i) == '0') answer[1]++;
else cntOne++;
}
s = Integer.toBinaryString(cntOne);
answer[0]++;
}
return answer;
}
}
✅ 해결 아이디어
- 반복문 범위 : s가 1이 아닐 때까지 / s의 길이가 1보다 클 때까지 반복하면 됨
- 회차 구하기 : 반복문 마지막에 answer[0]++ 해주면 쉬워짐
- 여기서 1의 개수 = 0 제거 후 길이
🔺 다른 풀이들
- 풀이1)
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int temp;
while( !s.equals("1") ) {
answer[1] += s.length();
s = s.replaceAll("0", ""); // 0 제거
temp = s.length(); // 0 제거 후 길이 = 1의 개수
s = Integer.toBinaryString(temp); // 십진수를 이진수로 변환
answer[0]++; // 회차
answer[1] -= temp; // 전체 - 1의 개수 = 0의 개수
}
return answer;
}
}
- 풀이2) 재귀함수
class Solution {
public static int count;
public static int zeroCount;
public int[] solution(String s) {
int[] answer = new int[2];
count = 0;
zeroCount = 0;
recursive(s);
answer[0] = count;
answer[1] = zeroCount;
return answer;
}
public static void recursive(String s){
if(s.equals("1"))
return;
count++;
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()){
if(c == '0'){
zeroCount++;
continue;
}
sb.append(c);
}
recursive(Integer.toBinaryString(sb.length()));
}
}
재귀함수랑 StringBuilder랑 toCharArray() 사용하심
반응형
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Lv. 2] 영어 끝말잇기 (0) | 2023.04.02 |
---|---|
[프로그래머스/Lv. 2] 짝지어 제거하기 (0) | 2023.04.02 |
[프로그래머스/Lv. 2] 다음 큰 숫자 (0) | 2023.04.02 |
[프로그래머스/Lv. 2] JadenCase 문자열 만들기 (0) | 2023.04.01 |
[프로그래머스/Lv. 2] N개의 최소공배수 (0) | 2023.04.01 |