일단은 이렇게 풀었는데, 알 수 없는 문제로 한참 헤맸다.
class Solution {
public int solution(int[] num_list) {
int even = 0;
int odd = 0;
for(int i=0; i<num_list.length; i++) {
if(i%2==0)
even+=num_list[i];
else
odd+=num_list[i];
}
return Math.max(even, odd);
}
}
▼ 이 풀이는 에러가 뜨고 (error: unexpected type)
class Solution {
public int solution(int[] num_list) {
int even = 0;
int odd = 0;
for(int i=0; i<num_list.length; i++) {
(i%2==0) ? (even+=num_list[i]) : (odd+=num_list[i]);
}
return Math.max(even, odd);
}
}
▼ 이 풀이는 잘 작동한다. 왜일까?
class Solution {
public int solution(int[] num_list) {
int even = 0;
int odd = 0;
for(int i=0; i<num_list.length; i++) {
int a = (i%2==0) ? (even+=num_list[i]) : (odd+=num_list[i]);
}
return Math.max(even, odd);
}
}
두 코드의 차이는 하나뿐이다. 삼항 연산자를 변수에 할당했는가 아닌가. 왜 이런 차이가 생길까?
삼항 연산자(ternary operator)
조건식 ? true반환값 : false반환값
여기서 포인트는 반환값이다. 조건에 대한 true/false의 결과가 실행문이 아니라 반환값이라는 것에 집중해야 한다.
사실 검색해보다 보면 실행문이라고 써놓는 경우도 많고, Oracle 공식문서에서도 Expression으로 표기해두었다.
그런데 여기서 굳이 반환값을 강조하는 이유는 삼항연산자의 특징에 있다.
삼항 연산자는 생긴 모습 때문에 그 자체로 하나의 실행문처럼 보일 수 있다. 그러나 명백히 연산자임을 기억해야 한다.
연산자는 연산을 수행하는 기호고, 연산 과정에서 연산자 외에 가장 필요한 것은 피연산자이지만, 연산 자체를 수행하기 위해서는 해당 연산의 결과를 대입할 곳이 필요하다.
대입 연산자(=)의 경우에는 피연산자 자체가 그 역할을 하지만, 삼항 연산자는 아니다.
따라서 true/false의 경우에 나오는 결과를 할당한 변수나, 그 결과를 매개변수로 사용할 메서드 등이 필요하다.
int ans += 5>2 ? 1 : 0;
또는 System.out.println( 5%2==0 ? "even" : "odd")
처럼!
(return도 가능. 특정 값을 반환하는 역할을 하기 때문에 해당 상황에서는 연산자에 대해 결과를 인자로 받는 메서드와 비슷한 역할을 한다고 이해했다.)
즉, 위의 코드에서 정수 a는 필요없어 보이고, 실제로도 사용되지 않지만, 연산을 대입하는 (연산값을 할당하는) 상자의 역할을 하고 있다.
그러니 다음부터는 삼항 연산자를 쓸 때 유의하자... 미래의 나야...
ps. 설명이 좀 미흡했는데, 다음에 고치고... 하... 암튼 삼항 연산자 덕분에 chatGPT랑 싸울 뻔 ㅎㅎㅎㅎ
'Study with me > 프로그래머스 L0 마스터하기' 카테고리의 다른 글
프로그래머스 - L0 할일목록 (0) | 2023.12.28 |
---|---|
프로그래머스 - L0 배열의원소삭제하기 (0) | 2023.12.27 |
프로그래머스 - L0 순서바꾸기 (0) | 2023.12.25 |
프로그래머스 - L0 공백으로구분하기2 // 정규표현식 (0) | 2023.12.22 |
프로그래머스 - L0 두수의연산값비교하기 // String ↔ int (0) | 2023.12.21 |