문제

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

문제

Given an array arr and a chunk size size, return a chunked array. A chunked array contains the original elements in arr, but consists of subarrays each of length size. The length of the last subarray may be less than size if arr.length is not evenly divisible by size.

You may assume the array is the output of JSON.parse. In other words, it is valid JSON.

Please solve it without using lodash's _.chunk function.

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

 

예시

 

코드

/**
 * @param {Array} arr
 * @param {number} size
 * @return {Array}
 */
var chunk = function(arr, size) {
    const outputArr = [];
    
    for(let i = 0; i < arr.length; i+=size){
        outputArr.push(arr.slice(i, i+size));
    }
    
    return outputArr;
};

 

 

인자로 들어오는 arr과 size로 새로운 배열을 만들어 리턴해야 한다. arr에 있는 원소들을 size만큼 잘라서 새로운 배열에 넣어주면 된다. Array.prototype.slice()를 이용해서 인자로 들어오는 arr를 size 만큼 잘라주었다.

728x90

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18_yw6I9MCFAZN&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 비트마스킹
public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());
        
        for(int t = 1; t <= T; t++){
            int N = Integer.parseInt(br.readLine());

            int k = 0; // 배수 저장
            
            // 9 8 7 6 5 4 3 2 1 0을 봤는지의 여부를 각각 저장함.
            // 0000000000과 같음.
            // 봤을 때 해당 자리를 1로 변경할 것임.
            int visited = 0;

            while (true){
                // k * N하기
                // 현재 센 양 번호를 구하고 char형 배열에 저장
                char[] sheepIdx = Integer.toString(++k * N).toCharArray();

                // 양 번호에 존재하는 숫자를 체크함
                for(int i = 0; i < sheepIdx.length; i++){
                    int num = sheepIdx[i] - '0'; // char 형을 int로 변경
                    
                    // 1. 오른쪽에서 num 자리번째가 1인 이진수 만들기
                    // 1 << num
                    // 2. 기존 visited에 1 표시하기
                    // 위에서 만든 이진수와 OR 연산을 통해 원하는 자리를 1로 변경하기
                    visited = visited | (1 << num);
                }

                // 0 ~ 9까지 모든 숫자를 봤는지 체크
                if(checkAllNumber(visited)) break;
            }

            sb.append("#").append(t).append(" ").append(k*N).append("\n");
        }

        System.out.println(sb.toString());
    }

	
    static final int standardNum = (1 << 10) - 1; // 1111111111. 모든 숫자를 보게 되는 경우
    public static boolean checkAllNumber(int targetNum){
        return targetNum == standardNum;
    }
}

 

728x90

문제

Write a function createHelloWorld. It should return a new function that always returns "Hello World".

https://leetcode.com/problems/create-hello-world-function/

 

예시

 

코드

/**
 * @return {Function}
 */
var createHelloWorld = function() {
    
    return function(...args) {
        return "Hello World";
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "Hello World"
 */

 

createHelloworld는 함수를 반환해야 하고, 반환된 함수를 호출했을 때 "Hello World"라는 문자열이 리턴되면 된다.

728x90

문제

Given a function fn, return a new function that is identical to the original function except that it ensures fn is called at most once.

  • The first time the returned function is called, it should return the same result as fn.
  • Every subsequent time it is called, it should return undefined.

https://leetcode.com/problems/allow-one-function-call/

 

예시

 

코드

type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
type OnceFn = (...args: JSONValue[]) => JSONValue | undefined

function once(fn: Function): OnceFn {
    let isCalled = false;

    return function (...args) {
        if(isCalled) return undefined;
        isCalled = true;
        
        return fn(...args);
    };
    
    
}

/**
 * let fn = (a,b,c) => (a + b + c)
 * let onceFn = once(fn)
 *
 * onceFn(1,2,3); // 6
 * onceFn(2,3,6); // returns undefined without calling fn
 */

once 함수는 단 한번만 실행되어야 하는 함수이다. 처음 실행됐을 때는 인자로 들어오는 fn이 실행되어야 하고, 그 후로 인자로 fn이 들어오면 undefined가 실행되어야 한다. 따라서 isCalled라는 변수를 이용해 fn의 실행 여부를 저장하고, 한 번 실행이 되면 isCalled를 true로 변경시켰다.

728x90

문제

Write a function createCounter. It should accept an initial integer init. It should return an object with three functions.

The three functions are:

  • increment() increases the current value by 1 and then returns it.
  • decrement() reduces the current value by 1 and then returns it.
  • reset() sets the current value to init and then returns it.

https://leetcode.com/problems/counter-ii/

 

예시

 

코드

/**
 * @param {integer} init
 * @return { increment: Function, decrement: Function, reset: Function }
 */
var createCounter = function(init) {
    let value = init;
    
    const counter = {
        increment() {
            return value += 1;
        },
        decrement(){
            return value -= 1;
        },
        reset(){
            return value = init;
        }
    }
    
    return counter;
};

/**
 * const counter = createCounter(5)
 * counter.increment(); // 6
 * counter.reset(); // 5
 * counter.decrement(); // 4
 */

 

 

createCounter가 counter 객체를 리턴하도록 하였다. counter 객체는 increment(), reset(), decrement() 메소드를 갖고 있으며, 인자로 들어온 초기값에 대해 각각 +1, init, -1 값을 리턴한다.

728x90

+ Recent posts