문제

Write a function expect that helps developers test their code. It should take in any value val and return an object with the following two functions.

  • toBe(val) accepts another value and returns true if the two values === each other. If they are not equal, it should throw an error "Not Equal".
  • notToBe(val) accepts another value and returns true if the two values !== each other. If they are equal, it should throw an error "Equal".

https://leetcode.com/problems/to-be-or-not-to-be/

 

예시

toBe()의 경우 expect의 인자와 toBe의 인자를 비교하여 같으면 true를 반환하고, 같지 않으면 "Not Equal"이라는 에러를 발생시킨다.

notToBe()의 경우 expect의 인자와 notToBe의 인자를 비교하여 다르면 true를 반환하고, 같으면 "Eqaul"이라는 에러를 발생시킨다.

 

코드

/**
 * @param {string} val
 * @return {Object}
 */
var expect = function(val) {
    
    // 같은지 여부를 비교하는 함수
    const isEqual = (val, target) => {
        return val === target;
    }
    
    const ERROR_MESSAGE = {
        TO_BE: "Not Equal",
        NOT_TO_BE: "Equal",
    }

    return {
        toBe: function (target){
            if(isEqual(val, target)) return true;
            throw new Error(ERROR_MESSAGE.TO_BE);
        },
        notToBe: function (target){
            if(!isEqual(val, target)) return true;
            throw new Error(ERROR_MESSAGE.NOT_TO_BE);
        },
    }
};

/**
 * expect(5).toBe(5); // true
 * expect(5).notToBe(5); // throws "Equal"
 */

isEqual() 함수로 이용해 expect()로 들어온 인자와 toBe() 혹은 notToBe에 들어온 인자가 같은지를 비교한다. 또한, 에러 메시지를 상수로 빼서 따로 저장하였다. 리턴하는 객체에서 toBe 메서드의 경우 isEqual일 때 true를 리턴하도록 하였고, notToBe 메서드의 경우 isEqual이 아닐 때 true를 리턴하도록 하였다.

728x90

문제

Write a function argumentsLength that returns the count of arguments passed to it.

https://leetcode.com/problems/return-length-of-arguments-passed/

 

예시

 

코드

/**
 * @param {...(null|boolean|number|string|Array|Object)} args
 * @return {number}
 */
var argumentsLength = function(...args) {
    return args.length;
};

/**
 * argumentsLength(1, 2, 3); // 3
 */

 

인자의 개수를 리턴하면 된다.

728x90

문제

https://www.acmicpc.net/problem/1541

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

 

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

 

출력

첫째 줄에 정답을 출력한다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;


public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] minusArr = br.readLine().split("-"); // - 기준으로 나누기

        // 최종 결과
        int result = 0;

        for(int i = 0; i < minusArr.length; i++){
            String[] plusArr = minusArr[i].split("\\+"); // + 기준으로 나누기

            int sum = 0; // + 부호를 갖고있는 number 저장하는 변수

            for(int j = 0; j < plusArr.length; j++){
                sum += Integer.parseInt(plusArr[j]);
            }

            if(i == 0){ // - 로 나누어진 배열의 가장 앞 인덱스에 들어있는 원소는 더해주어야 함
                result += sum;
            }else{
                result -= sum;
            }
        }

        System.out.println(result);
    }
}

 

값을 최소로 만들기 위해서는 열린 괄호가 `-` 바로 뒤, 닫힌 괄호가 그 다음에 등장하는 `-` 의 바로 앞에 있으면 된다. 즉 `-` 연산자를 기준으로 연산이 이루어지면 되기 때문에, `-`를 기준으로 split를 하여 minusArr에 저장하였다. 즉 minusArr의 각 원소 계산을 마치고 `-` 연산을 해주면 된다. minusArr의 원소는 `50+25+45` 이런식으로 들어가 있을 것이기 때문에 minusArr의 원소도 `+`를 기준으로 split을 해서 plusArr에 저장하고, plusArr에 들어있는 원소들을 다 더했다. 그리고 더한 결과 값을 최종 result 에서 빼주었다. 이때 minusArr[0]은 빼주면 안되고 더해주어야 한다. minusArr이 `-`를 기준으로 split 하였지만 처음 index는 앞에 `-` 부호가 없는 상태이기 때문이다.

728x90

문제

Create a class ArrayWrapper that accepts an array of integers in its constructor. This class should have two features:

  • When two instances of this class are added together with the + operator, the resulting value is the sum of all the elements in both arrays.
  • When the String() function is called on the instance, it will return a comma separated string surrounded by brackets. For example, [1,2,3].

https://leetcode.com/problems/array-wrapper/

 

예시

 

코드

/**
 * @param {number[]} nums
 * @return {void}
 */
var ArrayWrapper = function(nums) {
    this.nums = nums;
    this.sum = nums.reduce((acc, cur)=> acc + cur, 0);
};

/**
 * @return {number}
 */
ArrayWrapper.prototype.valueOf = function() {
    return this.sum;
}

/**
 * @return {string}
 */
ArrayWrapper.prototype.toString = function() {
    return "[" + String(this.nums) + "]";
}

/**
 * const obj1 = new ArrayWrapper([1,2]);
 * const obj2 = new ArrayWrapper([3,4]);
 * obj1 + obj2; // 10
 * String(obj1); // "[1,2]"
 * String(obj2); // "[3,4]"
 */

ArrayWrapper라는 객체를 만들고, ArrayWrapper 끼리 덧셈을 했을 때와 String으로 표현했을 때 원하는 값이 나오도록 ` ArrayWrapper.prototype.valueOf()` 메소드와 `ArrayWrapper.prototype.toString()` 메소드를 재정의했다.

ArrayWrapper 객체끼리 덧셈을 했을 때, 전체 원소의 합이 리턴되어야 한다. 따라서 각 객체를 호출했을 때의 원시 값이 해당 객체의 원소들의 합을 리턴할 수 있도록 처음 ArrayWrapper 객체를 생성할 때 sum이라는 변수에 입력 받은 초기 배열의 합을 reduce를 이용하여 계산하고 저장해놓았다. valueOf() 안에서 합을 계산할 지 고민했으나, 호출할 때마다 합을 계산하는 것이 비효율적일 것 같아서 ArrayWrapper 객체 생성 시 계산하여 저장하도록 하였다.


* Object.prototype.valueOf

`객체.valueOf()`

객체의 원시 값을 반환한다.

- Object는 모두 valueOf를 상속받는다.

- 객체가 원시 값을 갖고 있지 않다면, valueOf는 객체를 반환하며, 사용자 정의 객체를 만들 때는 valueOf를 재정의할 수 있다.

- 보통 원시 값을 필요로 할 때 알아서 호출된다.

function MyNumberType(n) {
  this.number = n;
}

MyNumberType.prototype.valueOf = function () {
  return this.number;
};

const object1 = new MyNumberType(4);

console.log(object1 + 3); // 7

 

 

* Object.prototype.toString

`객체.toString()` `String(객체)`

객체를 나타낼 수 있는 String 값을 리턴한다.

- 객체가 텍스트 값으로 표시되거나 문자열이 예상되는 방식으로 참조될 때 자동으로 호출된다.

- Object에서 비롯된 모든 객체에 상속된다.

function Dog(name) {
  this.name = name;
}

const dog1 = new Dog('Jindo');
console.log(dog1.toString()); // [object Object] -> 재정의 안 됐을 때

Dog.prototype.toString = function () {
	return this.name;
}

const dog2 = new Dog('bbibbi');
console.log(dog2.toString()); // 'bbibbi'
728x90

문제 설명

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

- 지도 1과 지도 2가 주어진다.

- 각 지도는 n x n이다.

- 지도 1과 지도 2는 벽 또는 공백으로 이루어져 있다.

- 전체 지도는 지도 1과 지도 2를 이용해 알 수 있다.

 - 두 지도 모두 공백이면 전제 지도에서도 해당 자리는 공백이며, 두 지도 중 하나라도 벽이라면 전체 지도에서도 벽이다.

- 두 지도는 10진수로 이루어진 일차원 배열로 주어지며, 이진수로 변경했을 때 0이 공백, 1이 #이다.

 

입출력 예제 설명

arr1과 arr2

arr1이 [9, 20, 28, 18, 11] 인데 이걸 이진수로 변환하면 [01001, 10100, 11100, 10010, 01011]이 된다. 각 배열의 원소를 이진수로 바꾼 값이 행이라고 생각하면 된다. 

 

코드

// " " : 공백
// "#" : 벽
// 둘 다 공백이면 전체 지도에서도 공백
// 하나라도 벽이 있으면 전체 지도에서도 벽
function solution(n, arr1, arr2) {
    const map = [];
    
    arr1.forEach((num1, idx)=>{   
        map.push((num1 | arr2[idx]).toString(2).padStart(n, '0').replaceAll('1', '#').replaceAll('0', ' '));  
    });
    
    return map;
}

문제에서 둘 다 공백일 때는 전체 지도도 공백이라고 하였고, 둘 중 하나라도 벽이라면 전체 지도에서도 벽이라고 되어있다. 이때, 공백을 표현하는 것이 0이며 벽을 표현하는 것이 1이기 때문에 ` 0 ? 0 = 0 ` , ` 0 ? 1 = 1 ` , ` 1 ? 0 = 1 ` 에서 ?에 들어가는 것은 ` OR(|) ` 가 된다.

 

따라서, 지도1과 지도2의 각각의 행을 | 연산을 해준 후 2진수로 변환해준다. `Array.prototype.toString(radix) ` 를 이용하면 10진수를 쉽게 2진수로 변환할 수 있다. 이때, 0101 이라는 결과가 나오면 JS에서는 101이라고 표시를 해주기 때문에, ` String.prototype.padStart() ` 를 이용하여 n 자리보다 자릿수가 적으면 앞에 빈 자리를 0으로 채울 수 있도록 했다.

 

마지막으로, 문제에서 원하는 것은 1을 #이로, 0을 공백으로 표시하는 것이기 때문에 `String.prototype.replace()`를 이용하여 1과 0을 원하는 값으로 변경해준다. 그리고 해당 값을 map 배열에 push 하여 map 배열을 리턴하도록 했다.

728x90

+ Recent posts