320x100
https://school.programmers.co.kr/learn/courses/30/lessons/12911
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반복문만 사용해서 문제를 풀었었지만 효율성에서 틀려서 새롭게 푼 코드
정확성은 맞지만 효율성이 틀린 답
class Solution {
public int solution(int n) {
int answer = 0;
String bi = Integer.toBinaryString(n);
StringBuilder sb = new StringBuilder(bi);
if(sb.indexOf("0") < 0){ // 111...1(0 0개)
sb.insert(1, "0");
}else { // 0 있음
if(sb.indexOf("1", 1) < 0){
sb.append("0"); // 100...0(1 1개)
}else{
int last1 = sb.lastIndexOf("1");
int index01 = sb.lastIndexOf("01");
if(index01 > -1){ // 1...01...(0있고 1 2개이상)
int index11after01 = sb.indexOf("11", index01);
if(index11after01 > -1){
String sub = sb.substring(0, index11after01 -1);
sb.replace(0, index11after01 +1, "");
sb.reverse();
sb.insert(0, sub);
sb.insert(sub.length(), "10");
}else{
sb.replace(last1-1, last1+1, "10");
}
}else if(sb.indexOf("11") == 0){ // 11...1100..0
String sub = sb.substring(0, last1);
sb.replace(0, last1+1, "").insert(0, "10").append(sub);
}
}
}
answer = Integer.parseInt(sb.toString(), 2);
return answer;
}
}
아무리 해도 효율성에서 틀리길래 처음 푸는것 처럼 다시 문제를 풀어보았다.
class Solution {
public int solution(int n) {
int answer = 0;
String bi = Integer.toBinaryString(n);
// 1의 개수
String one = bi.replace("0", "");
int cnt = one.length();
String newBi = "";
while(true){
newBi = Integer.toBinaryString(++n);
// 1의 개수
one = newBi.replace("0", "");
int newCnt = one.length();
if(cnt == newCnt){
break;
}
}
answer = Integer.parseInt(newBi, 2);
return answer;
}
}
이렇게 간단하게 해결...
그 전에도 이런식으로 풀려고 했는데 분명히 어디선가 잘못 했을 것이다.
처음 문제 풀 때 부터 꼼꼼하게 풀자..
메소드를 사용하면 시간이 증가할 수 있다는 걸 알게 되어서 테스트 해보았다.
위에서 푼 정답에 1의 개수를 구하는 메소드를 사용하였다.
class Solution {
public int solution(int n) {
int answer = 0;
String bi = Integer.toBinaryString(n);
// 1의 개수
int cnt = getOneCnt(bi);
String newBi = "";
while(true){
newBi = Integer.toBinaryString(++n);
// 1의 개수
int newCnt = getOneCnt(newBi);
if(cnt == newCnt){
break;
}
}
answer = Integer.parseInt(newBi, 2);
return answer;
}
public int getOneCnt(String bi){
String one = bi.replace("0", "");
int cnt = one.length();
return cnt;
}
}
결과는 효율성에서 하나 오버되었다.
코딩테스트에서는 메소드를 자제해야겠다.
320x100
'기타 > 코딩테스트' 카테고리의 다른 글
프로그래머스 코딩테스트 lv2-구명보트 : int 배열 정렬 (0) | 2023.02.23 |
---|