티스토리 뷰

JavaScript

JavaScript 문제풀이

ljy98 2022. 1. 3. 16:45

1. 돼지 그림 출력

2. n = 5*x + 3*y


1. 돼지 그림 출력

[그림 1] 돼지 그림

난이도 : ★☆

 

첫 번째 문제는 [그림 1]과 같은 돼지 그림을 출력하는 것이다. 언뜻 보면 console.log(""); 의 ""안에 다 때려넣으면 될 것 같지만 그렇게 단순하지 않다. 그 이유는 " ' `와 같은 문자 처리 때문이다.

 

[그림 2] 문자 처리 예시

만약 a""b를 출력하고 싶다면 console.log("a""b"); 라고 써주면 될 것 같지만 이 경우 에러가 뜬다. 이는 console.log();의 ()안에 한 쌍의 "", '', ``가 들어갈 수 있기 때문이다. 따라서 ""와 같은 표현을 중복해서 쓰고 싶다면 앞에 역슬래시(\)를 붙여주어야 한다. 다른 방법으로, 닫는 기호를 ''나 ``로 바꿔주어서 같은 표현이 중복되는 것을 피할 수 있다.

 

function pig() {
    console.log("|\\_/|\n|q p|   /}\n( 0 )\"\"\"\\\n|\"^\"`    |\n||_/=\\\\__|");
}

pig();

정답은 위의 코드블록과 같다. 물론 정답이 이것만 유일하게 존재하는 것은 아니다. 개행이 필요한 부분은 \n으로 처리했다.

 

 

2. n = 5*x + 3*y

Q. 어떤 자연수 n에 대해 n = 5*x + 3*y (x,y는 0 이상의 정수) 을 만족할 때 x+y의 최솟값을 반환하고, 그렇지 않으면 -1을 반환하는 함수를 만들어라.

 

난이도 :

 

코드를 짜기 전에 먼저 고려해야 할 사항들을 떠올려보았다.

(1) 임의의 n에 대해 n = 5*x + 3*y를 만족하는 x와 y값을 어떻게 찾을까? (if문, for문, while문 등을 어떻게 활용할까?)

(2) n = 5*x + 3*y를 만족하는 x,y가 여러 개일 때 어떻게 해결할까?

 

먼저 (1)에 대해 고민해보았다. 사실상 (1)과 (2)를 모두 고려할 수 있는 알고리즘을 제대로 생각할 수만 있어도 80%는 끝났다고 보면 된다. 일단 직관적으로, 반환값이 -1이 경우와 그렇지 않은 경우를 생각해보았다.

 

  • 반환값이 -1이 아닌 경우

3 = 5*0 + 3*1 →  반환값 : 1

5 = 5*1 + 3*0 →  반환값 : 1

13 = 5*2 + 3*1 → 반환값 : 3

14 = 5*1 + 3*3 → 반환값 : 4

  • 반환값이 -1인 경우

2, 4, 7, ...

 

그리고 2.의 경우도 살펴보았다.

15 = 5*3 + 3*0 = 5*0 + 3*5 → 반환값 : 3

21 = 5*3 + 3*2 = 5*0 + 3*7 → 반환값 : 5

 

(2)와 같이 (x,y)가 여러 쌍 존재하는 경우 y의 값이 최소인 경우를 뽑아야 한다. 따라서 내가 생각한 알고리즘은 다음과 같다.

 

n이 5의 배수인지 확인하고 (y=0일 때 x가 정수인지 확인) 맞으면 x = n/5, y = 0, result = x+y 그렇지 않으면,

n-3이 5의 배수인지 확인하고 (y=1일 때 x가 정수인지 확인) 맞으면 x = n/5, y = 1, result = x+y 그렇지 않으면,

n-6이 5의 배수인지 확인하고 (y=2일 때 x가 정수인지 확인) 맞으면 x = n/5, y = 2, result = x+y 그렇지 않으면,

...

n-(3의 배수) < 0 이 되면 -1 값을 반환

 

이를 코드로 구현하면 아래와 같다.

function solution(n) {
    let result, x, y;
    for (let i = 0; i < 1000; i++) {
        if (n%5 == 0) {
            x = n/5;
            y = i;
            result = x + y;
            break;
        } else if (n > 0) {
            n = n - 3;
        } else {
            result = -1;
            break;
        }
    }
    return result;
}
console.log(solution(49)); // 11

for 문에서 i < 1000; 의 숫자 1000은 임의로 넣은 값이다. 내가 짠 코드는 얼추 정답에 가깝지만 엄밀히 따지고 보면 엄청 큰 수에서는 성립하지 않기 때문에 완전한 답이라고 볼 수 없다. 이 부분은 while문의 조건에 true를 써서 무한반복문으로 해결할 수 있다.

 

function solution(n){
    let result = 0;

    if ( n%5 == 0 ) {
        result = n/5;
    } else {
        while(1){
            n = n - 3;
            result = result + 1;
            if (n%5 == 0) {
                result = result + (n/5);
                break;
            } else if (n <= 2) {
                return -1;
            }
        }
    }
    return result;
}

console.log(solution(90)); // 18

boolean은 true값과 false값을 가질 수 있는데, 이는 각각 이진법으로 1과 0에 해당한다. while문의 조건을 true로 하면 영원히 실행된다. 이를 응용해 while(1) {}을 사용하면, 위에서 for문의 i가 유한하기 때문에 생기는 문제를 해결할 수 있다.

 

while문을 쓰지 않고도 깔끔하게 풀 수 있는 방법을 알게 되어서 소개한다.

function solution(n) {
    let result, x, y;
    for (let i=parseInt(n/5); i >= 0; i--) {
        if ((n-(5*i))%3 == 0) {
            x = i;
            y = (n-(5*i))/3;
            result = x + y;
            break;
        }
        else {
            result = -1;
        }
    }
    return result;
}

console.log(solution(90)); // 18

 parseInt는 쉽게 말해 나눗셈에서 몫과 나머지가 있는데, 그 중 몫을 의미한다고 보면 된다. 

'JavaScript' 카테고리의 다른 글

JSON / prototype  (0) 2022.01.04
속성과 메소드 / 배열  (0) 2022.01.04
자주 쓰는 문자부호(" ' `) 정리  (0) 2022.01.03
JavaScript 기초2  (0) 2021.12.31
JavaScript 기초  (0) 2021.12.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함