코딩 스터디

요소 크기 비교 문제

hunm719 2023. 1. 31. 20:56

오늘 스터디 시간에는

 

1.오늘 배운 스키마 내용 복습

2.내일 해볼 스키마 과제 예습

을 진행했다.

 

 

복습한 내용은 부트캠프에 정리해두었고, 이 글에서는 오늘 풀었던 데일리 코딩 문제를 정리할 것이다.

오류부분을 어떻게 하면 깔끔하게 해결할 수 있을지 정말 많이 고민했고, 내가 생각하기에 정말 깔끔하게 수정한 것 같아 뿌듯해서 여기에 올려보려고 한다ㅎㅎㅎ

 

 

문제

수를 요소로 갖는 배열을 입력받아 각 요소들이 그 이전의 요소들의 합보다 큰지 여부를 리턴해야 합니다.

 

 

입력

인자 1 : arr

  • int타입을 요소로 갖는 배열
  • arr[i]는 정수

 

출력

  • boolean 타입을 리턴해야 합니다.
  • arr[i]는 arr[0]부터 arr[i-1]까지의 합보다 커야 합니다.

 

입출력 예시

1
2
3
4
5
boolean output = superIncreasing(new int[]{1361354});
System.out.println(output); // --> true
 
output = superIncreasing(new int[]{1359});
System.out.println(output); // --> false
cs

 

 

문제 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Solution { 
    public boolean superIncreasing(int[] arr) {
    // TODO:
 
    // 이전 요소들의 합 sum 선언
    int sum = 0;
    // arr[i] 와 sum을 비교하는 불리언 선언
    boolean isBig = true;
 
    // 반복문 순회 for
    for(int i = 0; i < arr.length; i++){
      // if(isBig이 false가 아니라면)
      if(isBig = true){
        // arr[i]가 sum보다 크면 isBig을 true로 하고 sum에 arr[i]계속더하기
        if(arr[i] > sum){
          isBig = true;
          sum += arr[i];
        }
        // else면 isBig = false;
        else isBig = false;
      }
      //else면 isbig이 false니까 반복문 탈출
      else break;
    }
    //isBig 리턴
    return isBig;
    }
}
cs

위와 같이 코드를 작성하고 테스트를 실행했더니

한 군데 문제가 있었다

테스트 하나를 통과하지 못했다.

자세히 살펴보니 arr[0]가 음수로 입력되면 초기값이 0인 sum보다 작기에 isBig이 false가 되어 최종적으로 false가 리턴되는 상황이었다.

 

arr[0]가 음수인 경우 실제로 코드가 실행되는 과정을 직접 계산해보았더니 아주 조금의 코드 수정만으로 해결할 수 있을거라는 생각이 들었고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Solution { 
    public boolean superIncreasing(int[] arr) {
    // TODO:
 
    // 이전 요소들의 합 sum 선언
    int sum = arr[0];
    // arr[i] 와 sum을 비교하는 불리언 선언
    boolean isBig = true;
 
    // 반복문 순회 for
    for(int i = 1; i < arr.length; i++){
      // if(isBig이 false가 아니라면)
      if(isBig = true){
        // arr[i]가 sum보다 크면 isBig을 true로 하고 sum에 arr[i]계속더하기
        if(arr[i] > sum){
          isBig = true;
          sum += arr[i];
        }
        // else면 isBig = false;
        else isBig = false;
      }
      //else면 isbig이 false니까 반복문 탈출
      else break;
    }
    //isBig 리턴
    return isBig;
    }
}
cs

sum의 초기값과 반복문의 시작점을 i=1로 수정하니 테스트를 통과할 수 있었다.

테스트 통과!!!

 

아주 조금의 수정으로 문제를 해결해서 매우 기뻤다.

 

 

+레퍼런스 코드를 살펴보니 굳이 isBig이라는 불리언값을 생성할 필요 없이 반복문 내부에서 순회를 모두 마치면 true를 리턴하고 중간에 빠져나와야 한다면 false를 리턴하게 했으면 보다 효율적인 코드가 된다는 걸 알았다. 역시 아직은 갈 길이 멀다.