본문 바로가기
개발공부하며 느낀 인생 공부

아직 기초도 모르는 반복문 다시 처음부터 해결[220621 TIL]

by 날파리1 2022. 6. 21.

항상 헷갈리는 자바 반복문

코딩문제 막혔을 때 오우 쉿

코딩 문제를 풀때 반복문이 나는 항상 어렵고 헷갈렸는데 항상 반복되는 변수 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분 이상을 썼다.

모를땐 하나하나씩 무식하게 대입해보아라 라는 조언을 알고있음에도 불구하고 계속 머릿속으로 계산하고 맞다고 자위했다.

머릿속으로 계산하지말고 직접 하나하나 식을 대입해보고 써본다. 내 머리는 컴퓨터 처럼 연산이 정확하지 않다.

어찌어찌 풀린다면?

추가 반성과 회고

나는 왜 매일 하기로 한 목표를 끝내지 못할까?

이유: 한가지 미션들을 완수하는데 너무 오래 걸린다. 꼼꼼히 정리할수 있고 짚을 수있다느 장점이 있지만 목표한 만큼의 양을 해내는 게 도저히 어렵다.

액션플랜은 ? 자주 반복이 중요하다고..하는데...꼼꼼한 필기를 놓더라도 일단 강의를 자주 반보해서라도 듣고 일단 체크표를 해보자...(그놈의 경로의존성...)

댓글