코드 그라데이션

[Lv.0] 첫 번째로 나오는 음수 본문

Java/알고리즘

[Lv.0] 첫 번째로 나오는 음수

완벽한 장면 2023. 5. 25. 20:23

https://school.programmers.co.kr/learn/courses/30/lessons/181896

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 

음수가 없다면 -1을 return합니다.

 

제한 사항

 

입출력 예

 

입출력 예 설명

 

아이디어 

  • num_list라는 정수 리스트는 무작위로 있는데, 거기서 내가 음수를 어떻게 알아? 라는 생각이 들 때는 다 보면 되지라는 생각으로 접근하면 된다.

 

초기 코드

class Solution {
    public int solution(int[] num_list) {
        for(int i=0; i<num_list.length;i++) {
            if(num_list[i] < 0) {
                return i;
            }
            else (i==num_list.length-1) {
                return -1;
            }
        }

    }
}

주의!!!!

  • 이렇게 했을 때 최초의 음수를 찾는 코드가 잘 작동을 하는가?
  • 맞다.
  • 여기서는 "첫 번째로 나오는 음수" 라는 것을 고려해주지 않았기 때문.
  • 여태껏 사람들이 작성했던 반복문은 0부터 시작, 즉 가장 앞에서부터 검사를 했다는 소리
  • 그리고 리턴은 만나자마자 함수가 종료되게 만든다.
  • 위 두 가지의 컬래버 때문에 이 코드는 최초의 음수를 잘 찾는 코드이다.
  • 그런데 여기서 else 부분은 음수가 없는 시점을 판단하는 로직은 아니다...

그래서 고쳐본 코드

class Solution {
    public int solution(int[] num_list) {
        for(int i=0; i<num_list.length;i++) {
            if(num_list[i] < 0) {
                return i;
            }
            if (i==num_list.length-1) {
                return -1;
            }
        }

    }
}

 

  • 인덱스 차이 고려해서 -1

그래도 여기서 에러가 나는데...

  • 지금 사실, 우리는 이 if문이 다 돌면 1 또는 -1 중에서 하나가 리턴될 것임을 정확히 안다.
  • 하지만 멍청한 컴퓨터는 모른다. 그래서 지금 "요기"라고 내가 적어놓은 부분에 도달하면 어떻게 할 건데??? 하고 아몰랑을 시전한다.
  • 컴파일러는 딱 구조적으로만 판단하기 때문에
  • for문 안 거치고, if문 안 돌고 "요기" 에 올 수도 있는 거 아니야? 라고 생각한다.
  • for문은 거치더라도 if문을 안 돌 수도 있는 거 아니야? 라고 생각할 수도 있고
  • 즉,,, 정리하자면 for문을 들어가더라도 if가 통과가 안 되어서 리턴이 안 되는 거 아니야? 가 가장 정확할 듯.
  • 이론적으로는 값에 따라서 //요기!!! 부분까지 올 수는 있으니까.
  • 그래서 코드를 이렇게 짜놓으면, 저 라인에 다다랐을 때 처리를 해줘야 한다.
class Solution {
    public int solution(int[] num_list) {
        for(int i=0; i<num_list.length;i++) {
            if(num_list[i] < 0) {
                return i;
            }
            if(i==num_list.length-1) {
                return -1;
            }
        }
        // 요기!!!
    }
}

 

그러면 이렇게 요기 부분에 무언가를 넣어줘야 하는데

쓰레깃값이라도 넣어야 한다. 아무 값을 리턴을 줘도 실행은 잘 됨을 확인할 수 있음.

class Solution {
    public int solution(int[] num_list) {
        for(int i=0; i<num_list.length;i++) {
            if(num_list[i] < 0) {
                return i;
            }
            if(i==num_list.length-1) {
                return -1;
            }
        }
        return 10000; // 이렇게 전혀 무관한 값 줘도 코드는 돌아간다...
    }
}
  • 그러면 이러한 번거로움을 줄이기 위해서 return 10000; 같은 부분을 빼야한다. 
  • 그럼 지금 if(i==num_list.length-1) {
                    return -1;
                } 이 로직은 반복문을 다 돌았음을 알려주려는 로직이긴 한데, 우리가 반복문이 다 돌았음을 확인할 수 있는 건 언제인지 생각해보면,
  • 이 부분을 생략해도 된다.
  • 그리고 10000자리에 -1을 집어넣으면 의미적으로 똑같다. 
  • 이 자리까지 왔는데 리턴이 된 적이 없다는 소리이니까...

 

 

최종 답안

class Solution {
    public int solution(int[] num_list) {
        for(int i=0; i<num_list.length;i++) {
            if(num_list[i] < 0) {
                return i;
            }
        }
        return -1; 
    }
}
// num_list[i] <0;

 

728x90
Comments