카테고리 없음

20240813 (화) 수준별 학습 Basic Class 1강 + 프로그래머스 [Q16]

ddh1713 2024. 8. 13. 15:40

 베이직 반 수업이 있기 까지 1시간 남짓 남은 시점... 예습을 하면서, 수업을 들을 때 더욱 흡수율이 좋을 수 있도록 정리를 해봐야겠다. + 수업을 듣고 와서 예습했던 부분에 모자란 부분을 다시 채워 넣는다.

JVM Runtime 환경, 메모리 영역과 변수 선언, 연산자, 제어문
배열 (스프링에서 배열이 쓰이는 곳은 딱 한군데 뿐!)
컬렉션(리스트,맵), 반복문

 

Index

[1] 배열 [2] 컬렉션 [3] 반복문
프로그래머스 코드리뷰 x 만큼의 간격이 있는 n 개의 숫자

 

[1] 배열 (Array)

int[] intArray1;	// 타입[] 변수;
int intArray2[];	// 타입 변수[];

 

두 가지 다 사용 가능하지만, 관례적으로 int[] intArray1; 라고 쓰는 것을 권장하기 때문에 이렇게 쓰도록 습관을 들이자.

 

하지만, 코딩할 때는 배열을 쓰지 말자. 유지보수 하기가 좋지 않다. 리스트(List) 를 사용하면 다 해결되기 때문이다. List 가 짱이다! 스프링에서 쓰이는 곳이 딱 한 군데가 있다고 튜터님께서 말씀해주셨다. 그 때 가면 알려주신다고 하셨다. 아직 어디에 쓰이는지는 모르겠다. 나중에 알게 될 것 같다.

 

[2] 컬렉션 : 여러가지가 있지만, 주로 많이 쓰는 것은 ListMap 이다.

 

 (1) List(ArrayList)

List<String> list = new ArrayList<>();

 

⇒ 위의 형태 외에는 스프링에서 잘 안쓴다고 한다.

 

 

 (2) Map(HashMap)

Map<key, value> map = new HashMap<>();

  HashMap 을 사용하면 시간복잡도가 0(1) 이 된다. 시간복잡도란 얼마나 빠르냐 하는가를 나타내는 정도이다.

 

[3] 반복문

for 문 과 while 문이 있는데, while 문은 잘 사용하지 않고, for 문을 사용한다. 그중에서도 특히 향상된 for 문을 많이 사용한다.

향상된 for 문을 사용할 때 쉽게 사용하는 방법 리스트에 . 을 붙이고 for 를 쓴 후 tab

 

 

Programmers Code Review 

x 만큼의 간격이 있는 n 개의 숫자

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

 

[문제]

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = {};
        return answer;
    }
}

[풀이]

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n]; // long[] answer 는 배열
                //    = {};
        for (int i = 0 ; i < n ; i++){
            answer[i] = x * (i + 1);
        // x=2, n=5 : long[0] = 2 + (2 * 0)
        //          : long[1] = 2 + (2 * 1)
        // x=a, n=b : long[i] = a + (a * i)
        // x  , n   : long[i] = x + (x * i)
        }
        return answer;
    }
}

 

 처음에는 이렇게 짰었는데, 사실 이 마저도 완성하지 못해서 에러가 많이 떴었다. 알고보니,

long[ ] answer = new long[ ];  이렇게만 작성했었는데, 배열을 선언만 하고, 크기를 지정해주지 않았기 때문이었다.

이렇게 하다가, 튜터님께 물어보고 알게된 사실은 배열의 크기를 지정할 때, 숫자가 아니라 매개변수(예 : n)가 들어가도 된다는 것을 알게 되었다.

 그래서 피드백을 받은 후, long[ ] answer = new long[n];   이라고 수정을 하고 나니, 테스트를 통과할 수 있었다. 이렇게 끝난 건 줄만 알았는데, 채점하기를 했는데 마지막 13,14번 테스트에서 다시 또 에러가 났다. 또 뭐가 문제지...? 라고 생각해보고, <질문하기>에 들어가서 여러가지를 찾아본 결과, 테스트할 때, int 가 표현할 수 없는 범위의 숫자도 테스트에 쓰이는 것 같았다. 그래서 형변환과 자료형 (Data type)에서 문제가 발생하는 것을 깨닫게 되었다. 여러 가지를 시도해보다가 울며 겨자먹기로 채점에서 통과를 했다. 마침내 완성한 코드는 아래와 같다.

 

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

 

 제한 조건을 읽어보면, n 과 i 는 1000 이하 이므로, int 의 표현범위 밖을 벗어나지 않아 영향을 받지 않지만, x 의 경우에는 곱하다보면, 반복문을 돌릴 때, (i+1) 과 곱셈을 연산하다 보면, i 가 100을 넘어가는 경우에 결과값이 int 의 표현범위 밖을 벗어난다는 것을 알게 되었다. 그래서 처음부터 매개변수 x 의 데이터형을 long 으로 선언해주고 마지막에 배열 answer 의 index 에 값을 대입하기 전에도 long 으로 명시적 형변환을 해주니, 올바르게 잘 실행되었다.

 

Try

ArrayList 와 HashMap 에 대해 공부를 해서 정리해보면 좋을 것 같다.
향상된 for 문을 좀더 자연스럽게 사용할 수 있도록 인텔리제이를 사용할 때 많이 연습해보면 좋을 것 같다.