프로그래머스 점위치 구하기 : https://school.programmers.co.kr/learn/courses/30/lessons/120841
//내 풀이
function solution(dot) {
//if 배열의 첫번째 숫자가 0보다 클때 아닐때 나누기
//중첩 if문 지양하기
if(dot[0]>0 && dot[1]>0){
return 1;
}else if(dot[0]<0&&dot[1]>0){
return 2;
}else if(dot[0]<0&&dot[1]<0){
return 3;
}else{
return 4;
}
}
문제를 보자마자 든 문제 해결점은 중첩 if문을 작성해서 x좌표가 음수일 때 양수일 때를 나누고 내부if문에는 y가 음수일때 양수일때는 나눠 리턴값을 달리 하는 것이 였다. 하지만 해당 코드는 중첩 if문을 써야해서 가독성이 떨어지고 또 조건문이 성능에 좋지 않다는 점이 떠올라 더 고민하는 시간을 가졌다. dot에 들어갈만한 변수들을 전부 공책에 작성해서 분석했지만 원하는 문제 해결점이 안떠올랐다. 결국 if문에 && 를 넣는 방법을 택했다.
//다른 이의 풀이
function solution(dot) {
const [num,num2] = dot; // 변수 num에 dot[0] 데이터를 변수 num2에 dot[1]을 각각 넣어줍니다.
const check = num * num2 > 0;
//그 둘의 곱이 0보다 크면 true -> 1구역 3구역 false -> 2 구역 4구역
return num > 0 ? (check ? 1 : 4) : (check ? 3 : 2);
//x축의 수가 양수일때 -> check 값도 true면 1구역 아니면 4구역
//x축의 수가 음수일떄 -> check값이 true면 3구멱 아니면 2구역
}
이런 삼항연산자속 삼항연산자라니! 처음에는 if문이 보이질 않았는데 다른 분(길종님)이 삼항연산자에 또 삼항연산자가 있다고 알려주셨다. 비록 문제를 풀 때 중첩 if문을 피할 길이 없어 보여서 아쉬웠지만 그래도 위의 코드는 구조분해를 코드활용이 어려운 나에게는 공부하기 좋은 코드 예시라고 생각했다. 코드를 분석하고 구조분해에 대해 더 공부해보자.
구조분해
구조분해는 객체의 속성을 해체하여 그 값을 개별 변수에 담습니다. 객체에서 구조 분해 할당을 사용하는 경우, 선언(const, let, var)과 함께 사용하지 않으면 에러가 발생할 수 있습니다.
function whois({displayName: displayName, fullName: {firstName: name}}){
console.log(displayName + " is " + name);
}
let user = {
id: 42,
displayName: "jdoe",
fullName: {
firstName: "John",
lastName: "Doe"
}
};
whois(user) // 질문: 콘솔에서 어떻게 출력될까요?
//jdoe is John
구조분해의 활용. 두 값 교환하기
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
Q. 구조분해할당할때 자바스크립트는 어떻게 동작하는 걸까?(답변대기중)
더 나아가기
//또 다른 사람의 풀이
function solution(dot) {
return dot[0] > 0 && dot[1] > 0 ? 1 :
dot[0] < 0 && dot[1] < 0 ? 3 :
dot[0] > 0 && dot[1] < 0 ? 4 :
dot[0] < 0 && dot[1] > 0 ? 2 : 0
}
나와 똑같은 풀이 방법을 취했지만 삼항연산자로 푼 풀이이다. else if문도 삼항 연산자로 푼 점이 인상깊었다. 다음에는 if문이나 else if문을 쓸때 삼항연산자로 풀어 연습해야겠다 생각했다.
var kvArray = [{key:1, value:10},
{key:2, value:20},
{key:3, value: 30}];
var reformattedArray = kvArray.map(function(obj){
//obj는 {key:1, value:10} {key:2, value:20}{key:3, value: 30} 차례로 들어감.
var rObj = {};
rObj[obj.key] = obj.value; //obj.key가 들어갈때 문자열로 형변환이 일어난다.
return rObj;
});
// reformattedArray는 [{1:10}, {2:20}, {3:30}]
// kvArray는 그대로
// [{key:1, value:10},
// {key:2, value:20},
// {key:3, value: 30}]
프로그래머스 중복된 숫자 갯수
function solution(array, n) {
//map 을 통해 [1,1,2,3,4,5]를 {1:2, 2:1, 3:1, 4:1, 5:1}로 만든 후에
//객체 obj.n을 리턴
const obj= {};
array.map(x=> {
// obj[x]===undefined? obj.x=1: obj.x++
//console.log(obj[x]);
if(obj[x]===undefined){
//obj.x=1; // 그냥 문자열 x를 넣어주는 거다.
//닷 노테이션 브라켓노테이션 전부 객체에 키과 값을 넣어줄수 있다.
// 단 닷 노테이션은 키의 정확한 이름을 알때 넣어줄수있고
//브라켓 노테이션은 변수명으로 넣어도 가능
obj[x]=1;
// console.log("변한값"+obj[x]);
}else{
//obj.x = obj.x +1;
obj[x]=obj[x]+1;
console.log("변한값"+obj[x]);
}
});
//나는 꼭 삼항연산자로 써볼테다이놈아
//만약 obj x 키값이 없다면 추가
// console.log(obj);
// obj[n]===undefined? return 0 : return obj[n] 하면 오류
return(obj[n]===undefined? 0 : obj[n]);
// if( obj[n]===undefined){
// return 0;
// }else{
// return obj[n];
// }
//console.log(obj[n]);
}
obj[n]===undefined? return 0 : return obj[n] 하면 오류가 난다는 것을 주의합니다. 삼항연산자에 리턴 값을 받아오고 싶다면 return() 안에 삼항연산자를 작성해야 합니다. 그리고 객체에 새로운 키와 값을 추가시 . notation과 [] notation 둘다 가능하나 key값을 정확히 알때는 닷 노테이션을 이용하고 변수명으로 key를 받을 때는 브라켓 노테이션을 사용해야합니다. key값을 직접 브라켓 노테이션에 입력가능하나 대괄호안에 반드시 문자열로 작성되어야 합니다.