코드 그라데이션
[Lv.0] 첫 번째로 나오는 음수 본문
https://school.programmers.co.kr/learn/courses/30/lessons/181896
문제 설명
정수 리스트 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
'Java > 알고리즘' 카테고리의 다른 글
[Lv.0] (2문제) 정수 찾기, 정수 부분 (0) | 2023.05.27 |
---|---|
[Lv.0] 중앙값 구하기 (0) | 2023.05.27 |
[Lv.0] 길이에 따른 연산 (0) | 2023.05.25 |
[Lv.0] (2문제) 소문자로 바꾸기, 대문자로 바꾸기 (0) | 2023.05.25 |
[Lv.0] 삼각형의 완성 조건 (0) | 2023.05.18 |
Comments