일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FP 특징
- 리액트 메모이제이션
- 항해99 미니프로젝트
- 렌더링 최적화
- 항해99 부트캠프
- 타입스크립트
- 자바스크립트 엔진 v8
- 항해99 사전스터디
- 웹 크롤링
- gql restapi 차이
- 리액트
- js배열 알고리즘
- this
- chromatic error
- 함수형 프로그래밍 특징
- 테스트 코드 툴 비교
- 웹팩 기본개념
- 코어자바스크립트
- Js module
- 리액트 렌더링 최적화
- 항해99
- 리액트 메모
- 리덕스
- next js
- toggle-btn
- 알고리즘
- JS module system
- jwt
- 실행컨텍스트
- v8 원리
- Today
- Total
Jaeilit
백준 스택수열 1874 js 본문
https://www.acmicpc.net/problem/18258
문제 이해하는데 1시간은 걸린거같다.
스택에 n 까지의 숫자가 들어간다는 거를
1씩 더해서 1 2(1+1) 이런식으로 들어간다고 이해를 해서 1시간 걸렸다.
여튼..
일단 틀린 내 코드
const fs = require("fs");
const filePath =
process.platform === "linux" ? "/dev/stdin" : "./준/스택/1874/input.txt";
const [n, ...ary] = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n")
.map(Number);
let stack = [];
let num = [];
let count = 0;
let index = 0;
while (count <= ary.length) {
if (!ary[index]) break;
if (count !== ary[index]) {
num.push(count + 1);
stack.push("+");
count++;
} else {
while (ary[index] && num[num.length - 1] === ary[index]) {
if (num.pop() === ary[index]) {
stack.push("-");
index++;
}
}
}
}
console.log(stack.join("\n"));
for 문으로 돌리기에는 루프 횟수가 부정확해서 while 을 써야하는 줄 알았다.
count 는 1, 2, 3, 4 ... n 까지의 숫자이고
index 는 포인터라 생각하면 된다. 배열의 0번 부터 읽어 올것.
예) count = 1 index=0 ary[index] = 4 이기 때문에 첫번째 if 문에 걸려서
count 가 4가 될때까지 + 해준다.
그리고 현재 ary[index] 4가 1 2 3 4 로 넣어주던 num 배열의 마지막 숫자랑 같은지 체크를 해서
pop 값이랑 ary[index] =4 와 같을 때까지 - 해준다.
결론은 30% 조금넘어서 출력초과가 나왔다.
정답코드
const fs = require("fs");
const filePath =
process.platform === "linux" ? "/dev/stdin" : "./준/스택/1874/input.txt";
const [n, ...arr] = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n")
.map(Number);
let answer = [];
let stack = [];
let count = 1;
for (let i = 0; i < n; i++) {
let num = arr[i];
// 아무조건 없이 + 8개를 넣는다
while (count <= num) {
stack.push(count);
count++;
answer.push("+");
}
let stackpop = stack.pop();
answer.push("-");
if (stackpop !== num) {
answer = ["NO"];
break;
}
}
console.log(answer.join("\n"));
로직 ...
for 문으로 일단 n 까지의 숫자를 while 문으로 넣어준다.
예) 첫 while
num = 4 , count 1, 2, 3, 4, stack = [1, 2, 3, 4]
그 다음 while 이 종료되고 4에서 멈춘 stack 배열에 pop 을 해주고 - 를 넣어준다.
stack = [1, 2, 3 ]
다시 num = 3 count 4가 num 보다 작으므로 while 은 pass 되고
배열에 pop 해주고 - 를 넣어준다. stack = [1 ,2 ]
--- answer = [ +, + , + , + , - ,- ]
3 번째 루프에서는 num = 6 count = 4 while 을 6까지 돌아준다. stack = [1, 2, 5, 6]
이런 로직으로 진행된다.
로직 상 많은 부분이 보장된다는 전제하에 이뤄진 코드 같다.
뭐.. 예외에 대한 no 부분 때문일수도 있겠다.
'알고리즘' 카테고리의 다른 글
프로그래머스 할인행사 js (0) | 2023.06.13 |
---|---|
귤 고르기 js (0) | 2023.05.25 |
백준 ATM 11399 js (0) | 2022.10.21 |
백준 구간 합 구하기 4 11659 js (0) | 2022.10.19 |
백준 좌표압축 18870 js (0) | 2022.10.17 |