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

[프로그래머스 - JAVA] 같은 숫자는 싫어

:)jun 2021. 12. 13. 21:11

https://programmers.co.kr/learn/courses/30/lessons/12906

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

//테스트코드

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz1_IHateSameNumberTest {

    Quiz1_IHateSameNumber q;

    @BeforeEach
    void setUp() {
        q = new Quiz1_IHateSameNumber();
    }

    @Test
    void 한개() {
        assertArrayEquals(new int[]{5}, q.solution(new int[]{5}));
    }

    @Test
    void test1() {
        assertArrayEquals(new int[]{1, 3, 0, 1}, q.solution(new int[]{1, 1, 3, 3, 0, 1, 1}));
    }

    @Test
    void test2() {
        assertArrayEquals(new int[]{4, 3}, q.solution(new int[]{4, 4, 4, 3, 3}));
    }
}

//프로덕션코드

import java.util.Stack;

public class Quiz1_IHateSameNumber {
    public int[] solution(int[] arr) {
        Stack<Integer> stack = new Stack<>();
        int lastNumber = -1;
        int newNumber;

        for (int i = 0; i < arr.length; i++) {
            newNumber = arr[i];
            if (lastNumber == newNumber) {
                continue;
            }
            stack.push(arr[i]);
            lastNumber = stack.peek();
        }

        int[] answer = new int[stack.size()];

        for (int i = answer.length - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }

        return answer;
    }
}


// 성공! 리팩토링하자

// 프로덕션코드

import java.util.Stack;

public class Quiz1_IHateSameNumber {
    public int[] solution(int[] arr) {
        Stack<Integer> stack = new Stack<>();
        int lastNumber = -1;
        int newNumber;

        deleteNextSameNumber(arr, stack, lastNumber);

        int[] answer = new int[stack.size()];
        setAnswer(stack, answer);

        return answer;
    }

    private void setAnswer(Stack<Integer> stack, int[] answer) {
        for (int i = answer.length - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }
    }

    private void deleteNextSameNumber(int[] arr, Stack<Integer> stack, int lastNumber) {
        int newNumber;
        for (int i = 0; i < arr.length; i++) {
            newNumber = arr[i];
            if (lastNumber == newNumber) {
                continue;
            }
            stack.push(arr[i]);
            lastNumber = stack.peek();
        }
    }
}

// 굿 깔끔하고 좋네요!