[Coding test] 0405_no.3 (java)

2020-04-05

Coding test / 0405_no.3

문제설명

유출 x

풀이

package T0405;

import java.util.*;

public class t3 {
	
    public static int solution(String road, int n) {
        int answer = 0;
        
        StringBuilder sb = new StringBuilder();
        sb.append(road);
        
        int ck = 0;
        for(int i=0;i<road.length(); i++) {
        	if(road.charAt(i) == '0')
        		ck++;
        }
        
        if(ck <=n)
        	return road.length();
        
        int lock = 0;
        LinkedList<Integer> zero_idx_list = new LinkedList<>();
        
        for(int i=0; i<road.length(); i++) {
        	char zero_chk = road.charAt(i);
        	
        	if(zero_chk == '0') {
	        	if(lock <n) {
	        		sb.replace(i, i+1, "1");
	        		zero_idx_list.add(i);
	        		lock++;//와 씨 락을 걸어줬으면서 어떻게 lock을 ++을 안해줘....
	        	}
	        	
	        	else {//lock을 옮겨준다
	        		int zero_first_idx = zero_idx_list.removeFirst();
	        		sb.replace(zero_first_idx, zero_first_idx+1, "0");
	        		sb.replace(i, i+1, "1");
	        		zero_idx_list.add(i);
	        	}
        	}//if
        	
        	//다 옮겨주고 나와서 연속 1의 개수 확인
        	String sr = sb.toString();
        	String res[] = sr.split("0");
        	
        	for(int j=0; j<res.length; j++) {
        		answer = Math.max(answer, res[j].length());
        	}
        	
        }//for
        
        
        return answer;
    }
	
	public static void main(String[] args) {
		String s = "111011110011111011111100011111";
//		String s = "001100";
		
		System.out.println(solution(s,3));
	}
}

후기 (30min)

왜 무조건 permutation으로만 풀려고 했을까..

어차피 연속으로 1이 있는 가장 큰 값을 찾는 것이기 때문에, 0이 떨어져있는 경우는 max에 도달하지 못하고

0이 연속으로 n번 붙어있어야 하기때문에, Sliding으로 풀 수 있다.

허어… 아쉽다 그래도 최대값이 뭔지 알고, 최대값을 가질 수 있는 기준이 뭔지 파악만 잘 한다면 이렇게 풀 수 있다는 것도 알아낼 수 있다! (테케는 돌았으나, 물론 정답인지는 모르지만…ㅎ)