알고리즘

문제로 접근하는 프로그래밍 - x만큼 간격있는 n개의 숫자

PSAwesome 2021. 6. 17. 02:31
반응형

프로그래밍을 이해하는 도구 중 프로그래머스 문제 풀이를 활용하는 글의 시작입니다.

기존 프로그래밍 문제라 함은, 주어진 문제 중 input, output의 테스트 성공을 목적으로 두었던 부분에서 더 발전할 수 있는 방향을 제시받아 기록을 남기게 되었습니다.

출제 문제는 프로그래머스의 연습 문제입니다.

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

[

코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

programmers.co.kr

](https://programmers.co.kr/learn/courses/30/lessons/12954)

문제:

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건:

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.

Solution.java

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for (var i = 0; i < n; i++) {
            answer[i] = ((long)(i + 1)) * x;
        }
        return answer;
    }
}

프로그래머 관점의 질문

  • 프로그래머스에서 정의한 테스트 코드만 모두 만족하면 되는 것인가?
    • 테스트 코드의 구현인가
    • 요구사항에 맞는 기능의 구현인가

프로그래밍 관점의 질문

  1. 반환 타입이 long 배열인 이유를 고민했는지?
    • 어떠한 이유에서 long 배열을 반환해야 하는가
  2. var를 사용한 이유?
    • var 키워드의 이해도
  3. 프로그래밍의 성능 중 가장 비중이 큰 이슈는 무엇인가?
    • 성능 이슈
    • 연산자 사용과 다른 방식의 고민은?
      • 캐싱의 개념
      • 이전 결과 활용
      • 전산 회로의 연산 결과

문제점

  1. 구현을 손과 머리로 설계하지 않고 바로 코드를 작성함.
    • 배열의 타입이 long인 이유를 인지하지 않음.
    • 자료형 사용을 명확히 표현.
    • 완성된 코드를 실행 (잦은 제출 지양).
  2. 제한 사항을 참고 정도로 여김.
    • 실제 클라이언트 요구사항일 경우 제한 사항의 내용은 개발자가 논의를 통해 이끌어야 할 내용.
    • 테스트 코드에서 영향이 없을 것으로 여겼기 때문에 코드에 반영하지 않음.
  3. 반복문 횟수만큼 형변환 로직을 추가.
    • 프로그래밍 성능의 최대 적은 반복문, 반복문의 작업을 줄이는 것.
  4. 문제 설명에서 x씩 증가하는 숫자의 의미 해석의 아쉬움(곱하기 연산으로의 문제 풀이 사용)
    • 곱하기 연산은 매번 처음부터 연산을 하는 방식.
    • 배열에 n - 1 번의 연산 결과가 있기 때문에 이미 연산한 값에서 x를 한 번만 더하는 개념을 반영하는 것이 효율적인 측면에서 정답에 가까울 수 있다.

개선해야할 내용 (이후 코드 작성의 패턴)

  1. 설계를 먼저 진행.
  2. 완성된 코드를 제출하고 캡처링.
    • 스스로 놓치고 있는 패턴을 파악하기.
    • 한 번의 제출에 오류 없애기.
    • IDE 사용을 자제해보기.
  3. 사용할 자료형 구체화하여 코드에 적용.
    • 자료형의 허용 길이를 인지하고 반영
    • 가장 효율적인 메모리를 사용하기 위한 자료형 선택
  4. 클라이언트 요구사항에서 부족한 부분을 보충하여 코드에 반영.
    • 기능 구현의 관점으로 문제를 바라볼 필요성
  5. 반복문에서 불필요한 작업은 최소화
    • 형변환을 반복할 때마다 발생시키지 않도록 clean 코드로 구현하는 것을 지향.
  6. 캐싱과 같은 효율적인 작업을 활용
    • 2, 4, 6, 8과 같이 2의 배수일 경우, 8은 6 + 2의 결과.
    • 2 * 4인 (2 + 2 + 2 + 2)와 6 + 2가 같은 결과일 때 이미 연산이 이루어진 결과를 활용하는 개념이 익숙해지는 것이 좋은 코드를 만들어낼 가능성이 높다.

결과 코드

class Solution {
    public long[] solution(int x, int n) {
        if (x < -10000000 || x > 10000000 || n > 1000) {
            return null;
        }

        long[] answer = new long[n];
        long castX = x;
        answer[0] = castX;
        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] + castX;
        }
        return answer;
    }
}
반응형