티스토리 뷰
1. 돼지 그림 출력
2. n = 5*x + 3*y
1. 돼지 그림 출력
난이도 : ★☆☆☆☆
첫 번째 문제는 [그림 1]과 같은 돼지 그림을 출력하는 것이다. 언뜻 보면 console.log(""); 의 ""안에 다 때려넣으면 될 것 같지만 그렇게 단순하지 않다. 그 이유는 " ' `와 같은 문자 처리 때문이다.
만약 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
- Browser Object Model
- Navigator 객체
- stdio.h
- c언어
- 키워드
- short
- bom
- Document Object Model
- long
- keyword
- window 객체
- gcc
- History 객체
- 자료형
- 컴파일
- 변수
- 리액트 #React #props #state #javascript
- int
- Screen 객체
- location 객체
- DOM
- Char
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |