20240813 (화) 수준별 학습 Basic Class 1강 + 프로그래머스 [Q16]
베이직 반 수업이 있기 까지 1시간 남짓 남은 시점... 예습을 하면서, 수업을 들을 때 더욱 흡수율이 좋을 수 있도록 정리를 해봐야겠다. + 수업을 듣고 와서 예습했던 부분에 모자란 부분을 다시 채워 넣는다.
JVM Runtime 환경, 메모리 영역과 변수 선언, 연산자, 제어문 배열 (스프링에서 배열이 쓰이는 곳은 딱 한군데 뿐!) 컬렉션(리스트,맵), 반복문 |
Index
[1] 배열 | [2] 컬렉션 | [3] 반복문 |
프로그래머스 코드리뷰 | x 만큼의 간격이 있는 n 개의 숫자 |
[1] 배열 (Array)
int[] intArray1; // 타입[] 변수;
int intArray2[]; // 타입 변수[];
두 가지 다 사용 가능하지만, 관례적으로 int[] intArray1; 라고 쓰는 것을 권장하기 때문에 이렇게 쓰도록 습관을 들이자.
하지만, 코딩할 때는 배열을 쓰지 말자. 유지보수 하기가 좋지 않다. 리스트(List) 를 사용하면 다 해결되기 때문이다. List 가 짱이다! 스프링에서 쓰이는 곳이 딱 한 군데가 있다고 튜터님께서 말씀해주셨다. 그 때 가면 알려주신다고 하셨다. 아직 어디에 쓰이는지는 모르겠다. 나중에 알게 될 것 같다.
[2] 컬렉션 : 여러가지가 있지만, 주로 많이 쓰는 것은 List 와 Map 이다.
(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 문을 좀더 자연스럽게 사용할 수 있도록 인텔리제이를 사용할 때 많이 연습해보면 좋을 것 같다. |