문자열
문제는 다음과 같다
어떠한 요령이나 알고리즘이 있는 것이 아니라, 문자가 바뀔 때마다 flip을 진행하면 된다.
따라서 맨 처음에는 문자열을 전체 순회하며 연속된 문자를 삭제한 후, 길이를 반환하도록 하였다. 예를 들면, “10111” 문자열을 “101“로 바꾸고, 3을 return하는 것이다.
public int minFlips(String target) {
StringBuilder sb=new StringBuilder(target);
for (int i=1;i<sb.length();i++){
if (sb.charAt(i-1)==sb.charAt(i)){
sb.deleteCharAt(i);
i--;
}
}
if (sb.charAt(0)=='0') return sb.length()-1;
else return sb.length();
}
위와 같이 작성했더니 시간이 174ms가 나왔다.
다시 생각해보니 어차피 전체 문자열을 순회할거면 굳이 중복을 없앤 새 문자열을 생성할 필요 없이 숫자가 바뀔 때마다 값을 증가시킨 후 반환하면 될 것이었다.
public int minFlips(String target) {
int flips=0;
if (target.charAt(0)=='1') flips++;
for (int i=1;i<target.length();i++){
if (target.charAt(i)!=target.charAt(i-1)) flips++;
}
return flips;
}
위 코드는 훨씬 줄었지만 평균에 비해 한참 못 미치는 성능(9ms)을 보였다.
결국 solutions를 참고하게 되었는데, 그 중 사람들이 가장 많이 작성한 코드는 다음과 같다.
class Solution {
public int minFlips(String target) {
int c=0;
char flag='0';
for(char ch:target.toCharArray())
{
if(ch!=flag)
{
c++;
flag=ch;
}
}
return c;
}
}