be_better

[프로그래머스] 프로세스 본문

코딩테스트/프로그래머스

[프로그래머스] 프로세스

NiceTry 2023. 8. 11. 18:54

목차

    💎 문제 링크

    https://school.programmers.co.kr/learn/courses/30/lessons/42587

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    📝 문제

     

    ✍🏻 입력 & 출력

     

    🤔 풀기 전에 생각하기

    처음 배열의 location값을 잃지 않도록 계속 갖고 있어야겠다.

    배열을 처음부터 끝까지 다 확인하고 제일 앞 숫자가 제일 큰 수가 아니라면 맨 뒤에 추가하고

    처음 저장한 값의 위치는 계속 이동하기 때문에 신경써서 갱신해줘야 한다.

     

    제일 앞 숫자가 제일 큰 수 라면 count를 증가 시키고 LinkedList에서 빠져나가도록 한다.

    제일 앞 숫자가 제일 크고 원래 원하던 위치의 값이라면 count를 증가 시키고 count를 return

     

    ✨ 풀이

    import java.util.LinkedList;
    import java.util.List;
    
    public class Solution {
        public int solution(int[] priorities, int location) {
            LinkedList<Integer> list = new LinkedList<>();
            int target = priorities[location]; // 처음 값 저장
            priorities[location] = 0; // priorities는 1부터 들어갈 수 있기 때문에 해당 위치 값을 0으로 만들어서 비교하기 쉽게 함
            int count = 1; // 해당 위치의 숫자가 바로 빠져나갈 수 있기 때문에 count는 1부터 시작
    
            for (int i = 0; i < priorities.length; i++) {
                list.add(priorities[i]);
            }
    
            while (!list.isEmpty()) { // 리스트의 크기가 0보다 클 동안만
                boolean flag = true; // 제일 앞 숫자가 제일 큰 수가 아니면 false로 바꿔준다.
                int firstNum = list.poll(); // 제일 앞 숫자를 꺼내서 저장할 변수
    
                for (int i = 0; i < list.size(); i++) {
                    if (firstNum == 0) { // 제일 앞 숫자가 원하는 위치의 값이라면
                        if (target < list.get(i)) { // 두번째부터의 숫자가 저장해놨던 값보다 크면
                            list.offerLast(firstNum); // 맨 뒤에 add
                            flag = false; // count를 증가시킬 수 없게 false로 바꿔준다.
                            break; // for문을 빠져나감
                        } else continue; // for문 초기값 i를 하나 증가시키는 역할
                    } else if (list.get(i) == 0 && firstNum < target) { // for문을 돌다가 원하는 위치의 값 0을 만났지먄 처음 숫자가 target보다 작다면
                        list.offer(firstNum);
                        flag = false;
                        break;
                    } else if (firstNum < list.get(i)) { // 단지 제일 앞 숫자가 제일 큰 수가 아니라면
                        list.offer(firstNum);
                        flag = false;
                        break;
                    }
                }
    
                /*
                 * flag가 false로 바뀌지 않고 나왔다면
                 * 제일 앞 숫자가 list에서 제일 큰 수라는 것을 의미
                 */
                if (flag && firstNum == 0) return count; // 그 수가 원하는 값이라면 return
                if (flag) count++; // 원하는 수가 아니고 단지 제일 큰 수라면 add하지않고 count증가
            }
    
            return count;
        }
    }