항상 헷갈리는 자바 반복문
코딩 문제를 풀때 반복문이 나는 항상 어렵고 헷갈렸는데 항상 반복되는 변수 2개이상이 나온 것 같아서 2가지 변수에 해당하는 반복문 즉 2중 포문으로 풀려고하니 너무 어려웠다. 어떤 변수를 넣어야할지도 모르겠고 그래서 그냥 몇 개의 템플릿이 주어진 상황을 외우려고 하니 아주 조금 나아졌다. 일단 지금까지 정리한 상황을 간단하게 정리하면
1. 반복하려고 하는 범위가 명확하고 길이가 정해져 있다면 for 문
2. 반복의 범위가 명확하지 않다면 while 로
또 오늘 헷갈려서 틀렸던 아주 간단한 쉬운문제를 짚고 넘어가려고 한다.
문제를 쓰려고 하니 너무 길어질 것 같고 내가 헷갈렸던 핵심만 짚고 넘어가겠다.
문제의 핵심은 배열에서 가져온 각 값을 곱한뒤 더해주는 것이다.
내가 처음 작성한 식은
@Test
void case0() {
int[] a = {1,2,3,4};
int[] b = {-3,-1,0,2};
int result = 0;
for(int i = 0; i < a.length; i += 1) {
result = a[i]*b[i];
result += result;
}
assertEquals(3,result);
이러면 예상값 3 에 기댓값 16이 나온다.
틀린 이유
result = a[i]*b[i];
result += result;
-> 이 식은 계산한 a[i]*b[i] 값을 result에 넣어준 후 다시 돌아가서 다시 result 에 a[i]*b[i] 새 값을 넣는다.
즉 a[i]*b[i] 값들이 저장되지 않고 매번 갱신된다. 나는 a[i]*b[i] 값을 구한뒤 저장하고 다음값을 구해 저장해놓은 곳에 더하는 과정이 필요했다.
해결은
@Test
void case2() {
int[] a = {-1,0,1};
int[] b = {1,0,-1};
int result = 0;
int result1 = 0;
for(int i = 0; i < a.length; i += 1) {
result1 = a[i]*b[i];
result += result1;
}
assertEquals(-2,result);
}
이렇게 해주면 result1 값이 매번 갱신되고 result1 값은 내가 원하는 result 값에 저장된다.
그런데 이식은 너무 복잡하므로 다시 간략화 해준다면
public int solution(int[] a, int[] b) {
int answer = 0;
for(int i = 0; i < a.length; i += 1) {
answer += a[i]*b[i];
}
return answer;
이렇게 정리해 줄 수 있다.
배운 점
사실 처음에 막혔을 땐 '내 식엔 문제가 없는데 도대체 뭐가 문제지?'라며 15분 이상을 썼다.
모를땐 하나하나씩 무식하게 대입해보아라 라는 조언을 알고있음에도 불구하고 계속 머릿속으로 계산하고 맞다고 자위했다.
머릿속으로 계산하지말고 직접 하나하나 식을 대입해보고 써본다. 내 머리는 컴퓨터 처럼 연산이 정확하지 않다.
추가 반성과 회고
나는 왜 매일 하기로 한 목표를 끝내지 못할까?
이유: 한가지 미션들을 완수하는데 너무 오래 걸린다. 꼼꼼히 정리할수 있고 짚을 수있다느 장점이 있지만 목표한 만큼의 양을 해내는 게 도저히 어렵다.
액션플랜은 ? 자주 반복이 중요하다고..하는데...꼼꼼한 필기를 놓더라도 일단 강의를 자주 반보해서라도 듣고 일단 체크표를 해보자...(그놈의 경로의존성...)
'개발공부하며 느낀 인생 공부' 카테고리의 다른 글
우리는 왜 다 끝내지 못하는가?[220623 TIL] (0) | 2022.06.23 |
---|---|
자바 배열의 선언과 초기화[220622 TIL] (0) | 2022.06.23 |
테스트 코드짤때 각기 다른 경우 값의 변수는 어디에? [220620 TIL] (0) | 2022.06.20 |
220619 til (오늘은 또 무얼 배웠나) (0) | 2022.06.19 |
HTTP 서버, 다시보는 마카오뱅크 그리고 메가테라...(메가테라 220618 til) (0) | 2022.06.19 |
댓글