[Lv.1] 햄버거 만들기

작성일     업데이트:

카테고리:

태그:

내 풀이

처음엔 간단하게 생각했다
for문으로 돌면서 {1,2,3,1} 이 되는 구간을 집어내서 없애고 다시 처음부터 돌면서 또 없앨 구간을 찾아내고 하는식으로
그 횟수를 세게끔 하면 될거라고 생각해서 그대로 했더니 바로 런타임 오류가 떠버렸다..
그래서 계속해서 런타임을 줄이려고 시도를 해봤는데
{1,2,3,1}을 없앨때마다 새 ArrayList를 반환하지 말고 static 변수로 아예 묶어두고 유동적으로 값을 변경시킨다거나(그대로 런타임오류남)
먼저 한줄을 쫙 돌면서 {1,2,3,1}을 모두 없애고 다시 처음부터 돌아가서 검열을 시작 하는 식으로 돌려보거나(테스트 : [1, 1, 2, 1, 2, 3, 1, 3, 1, 2, 3, 1] 답 3이 나와야 하는데 틀림 ㅠㅠ)
이 외에도 한참동안 헤메다가 {1,2,3,1}을 없애면 리스트 맨앞부터 다시 검열을 시작하는 부분이 너무 시간을 잡아먹는다고 느껴서
아예 {1,2,3,1}를 잡아낸 곳 위치를 기억하게끔 만들고 다음 회차는 그 위치부터 돌도록 만들었다
드디어 성공!..은 찍었으나 영 코드 짜임새가 마음에 들지 않아 앞으로 갈길이 멀구나를 또 한번 느꼈다ㅠㅜ
뭔가 더 코드도 줄이고 가독성 좋게 만들 수 있을텐데 아쉽기만 하다

[코드보기]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    static ArrayList<Integer> arr;

    public int solution(int[] ingredient) {
        arr = new ArrayList<>(Arrays.stream(ingredient).boxed().collect(Collectors.toList()));
        ArrayList<Integer> list = new ArrayList<>(4);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(1);

        int num = 0;
        int start =0;
        int answer = 0;

         while( arr.size()!= num ) {
            num = arr.size();
            start = check1(list, start);
            if(arr.size()!= num ) {
              answer++;
            }
 		     }

        return answer;
    }


	public static int check1(ArrayList<Integer> list, int start ) {
	 		boolean bool = false;
      int st = start;
	 		if(st<3) {	st =3; }

	 		for( int i =st; i < arr.size(); i++) {
	 			bool = arr.subList(i-3, i+1).equals(list);
	 			if(bool){
	 				arr.subList(i-3, i+1).clear();
	 				return i-4;
	 			}
	 		}

	 		return 0;

	 	}

}


다른 사람의 풀이 1

다른 사람들의 풀이를 찾아 보다보니 내가 풀어나가고자 하던 방향과 비슷한 풀이를 찾았다
이렇게 깔끔하게 끝낼 수 있는거였다니..

[코드보기]
for(int i=0; i<arr.length-3; i++){
    if(arr[i]==0) continue;
    if(arr[i]==1&&arr[i+1]==2&&arr[i+2]==3&&arr[i+3]==1){
        for(int j=i+3; j>0;j--){
            arr[j] = (j>3) ? arr[j-4] : 0;
        }
        answer++;
}


이곳에서는 배열의 i번째 위치를 기준으로 그 다음의 값 3개를 더 가져와 {1,2,3,1}이 맞는지 검열시킨다
그리고 나처럼 어디서 검열한 값을 없앴는지 기록할 필요가 없도록 바로 처리를 했는데
검열한 위치의 각 값에 현재위치로부터 -4번째의 값을 덮어씌워버린 것이다(= 이미 검열했던 값을 다시 땡겨옴)
검열된 값 위치에 그 전에 검열을 했지만 다시 검열이 필요해진 위치의 값들을 넣어버리면서
한번 검열했다고 다시 처음부터 for문을 돌릴 필요 없이 그저 한바퀴만 돌면 모든 경우를 체크하도록 되었다


다른 사람의 풀이 2

다른 풀이들로는 사람들이 Stack을 사용하여 풀어낸 코드들이 많았는데
Stack 상에 배열의 값을 하나하나 넣어주면서 값이 들어갈 때 마다 아래 미리 쌓여있던 값들과 비교해서
{1,3,2,1}이 맞다면 stack.pop()을 사용하여 없애주는 식으로 풀어나간 경우가 많았다
여기서 {1,2,3,1}이 아니고 {1,3,2,1}인 이유는 Stack은 값이 위로 차곡차곡 쌓이기 때문이다
가장 나중에 넣은값이 가장 위에 있기때문에 stack.pop()을 사용하면 위에있는 값부터 사라지게 된다

댓글남기기