Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 31 additions & 11 deletions solutions/gwonwoo/0123/[문제08]괄호짝맞추기.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,35 @@
const fs = require('fs');
let input = fs.readFileSync(0).toString().trim().split('');
// const fs = require('fs');
// let input = fs.readFileSync(0).toString().trim().split('');

function solution() {
// 뒤에서부터 순회 (앞에서 지우면 인덱스가 밀리기 때문)
for (let i = input.length - 2; i >= 0; i--) {
if (input[i] === '(' && input[i + 1] === ')') {
// 두 문자를 배열에서 제거
input.splice(i, 2);
// function solution() {
// // 뒤에서부터 순회 (앞에서 지우면 인덱스가 밀리기 때문)
// for (let i = input.length - 2; i >= 0; i--) {
// if (input[i] === '(' && input[i + 1] === ')') {
// // 두 문자를 배열에서 제거
// input.splice(i, 2);
// }
// }
// }
// solution();

// console.log(input.length === 0 ? true : false);

function solution(s) {
// "(" 괄호를 저장할 배열
const arr = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === '(') {
arr.push(s[i]);
}
// ")" 괄호인 경우
else if (s[i] === ')') {
// 배열이 비어 있으면 짝이 안 맞으므로 false
if (arr.length === 0) {
return false;
}
// 짝이 맞으면 "(" 괄호 하나 제거
arr.pop();
}
}
return arr.length === 0;
}
solution();

console.log(input.length === 0 ? true : false);
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
const fs = require('fs');
let num = Number(fs.readFileSync(0).toString());
// const fs = require('fs');
// let num = Number(fs.readFileSync(0).toString());

let result = [];
function solution() {
// let result = [];
// function solution() {
// while (num > 0) {
// let last = num % 2;
// num = Math.floor(num / 2);
// result.push(last);
// }
// // 뒤집어서 올바른 이진수 순서로 변경
// result.reverse();
// console.log(result.join(''));
// }
// solution();

function solution(s) {
if (s === 0) return 0;

const arr = [];
while (num > 0) {
let last = num % 2;
num = Math.floor(num / 2);
result.push(last);
arr.push(last);
}
// 뒤집어서 올바른 이진수 순서로 변경
result.reverse();
console.log(result.join(''));
return arr.reverse().join('');
}
solution();
73 changes: 55 additions & 18 deletions solutions/gwonwoo/0123/[문제10]괄호회전하기.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,69 @@
function isValid(s) {
let check = [];
for (let i = 0; i < s.length; i++) {
check.push(s[i]);
// function isValid(s) {
// let check = [];
// for (let i = 0; i < s.length; i++) {
// check.push(s[i]);

// 현재 스택 길이
let num = check.length;
// // 현재 스택 길이
// let num = check.length;

if (check[num - 2] === '[' && check[num - 1] === ']')
check.splice(num - 2, 2);
if (check[num - 2] === '{' && check[num - 1] === '}')
check.splice(num - 2, 2);
if (check[num - 2] === '(' && check[num - 1] === ')')
check.splice(num - 2, 2);
}
if (check.length == 0) {
return true;
// if (check[num - 2] === '[' && check[num - 1] === ']')
// check.splice(num - 2, 2);
// if (check[num - 2] === '{' && check[num - 1] === '}')
// check.splice(num - 2, 2);
// if (check[num - 2] === '(' && check[num - 1] === ')')
// check.splice(num - 2, 2);
// }
// if (check.length == 0) {
// return true;
// }
// }

// function solution(s) {
// let count = 0;
// // 문자열을 회전시키면서 검사
// for (let i = 0; i < s.length; i++) {
// // 현재 문자열이 올바른 괄호면 카운트 증가
// if (isValid(s)) {
// count++;
// }
// // 문자열을 왼쪽으로 한 칸 회전
// s = s.slice(1) + s[0];
// }
// return count;
// }

function isValid(str) {
const stack = [];
// 올바른 괄호 문자열을 객체형태로 저장
const object = {
'(': ')',
'{': '}',
'[': ']',
};
for (let i = 0; i < str.length; i++) {
const chr = str[i];
// 현재 문자가 여는 괄호라면 stack에 push
if (object[chr]) {
stack.push(chr);
} else {
// stack 배열 길이가 0인경우, 배열 마지막에 저장된 값의 value값이 현재 chr과 같지 않은 경우 무조건 false
if (stack.length === 0 || object[stack.pop()] !== chr) {
return false;
}
}
}
return stack.length === 0 ? true : false;
}

function solution(s) {
let count = 0;
// 문자열을 회전시키면서 검사
// s 길이만큼 for문 반복
for (let i = 0; i < s.length; i++) {
// 현재 문자열이 올바른 괄호면 카운트 증가
// 문자열이 "올바른 괄호 문자열"인지 확인
if (isValid(s)) {
count++;
}
// 문자열을 왼쪽으로 한 칸 회전
// s문자열 맨 앞 문자를 s문자열의 맨 뒤로 이동
s = s.slice(1) + s[0];
}
return count;
Expand Down
40 changes: 26 additions & 14 deletions solutions/gwonwoo/0123/[문제11]짝지어제거하기.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,35 @@
function solution(s) {
let answer = 0;
// function solution(s) {
// let answer = 0;

// 짝을 비교하기 위한 스택 배열
const stack = [];
// 문자열을 배열로 변환 (문자 하나씩 순회하기 위해)
const arr = [...s];
// // 짝을 비교하기 위한 스택 배열
// const stack = [];
// // 문자열을 배열로 변환 (문자 하나씩 순회하기 위해)
// const arr = [...s];

// for (let chr of arr) {
// // 스택이 비어있지 않고, 스택의 마지막 값이 현재 문자와 같다면
// if (stack.length && stack[stack.length - 1] === chr) {
// // 짝이므로 제거
// stack.pop();
// } else {
// // 짝이 아니면 스택에 추가
// stack.push(chr);
// }
// }

// stack.length === 0 ? (answer = 1) : (answer = 0);

// return answer;
// }

for (let chr of arr) {
// 스택이 비어있지 않고, 스택의 마지막 값이 현재 문자와 같다면
function solution(s) {
const stack = [];
for (let chr of s) {
if (stack.length && stack[stack.length - 1] === chr) {
// 짝이므로 제거
stack.pop();
} else {
// 짝이 아니면 스택에 추가
stack.push(chr);
}
}

stack.length === 0 ? (answer = 1) : (answer = 0);

return answer;
return stack.length === 0 ? 1 : 0;
}
Empty file.
2 changes: 2 additions & 0 deletions solutions/gwonwoo/0127/[문제15]요세푸스문제.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ while (que.length) {
}

console.log(`<${result.join(', ')}>`);

const queue = Array.from(queue.fill(1));
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
function solution(arr, target) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] === target) {
return true;
}
}
}
return false;
}
// 이중 for문을 사용함으로 시간복잡도는 O(n^2)가 발생한다.
// 그리고 가독성도 그렇게 좋아보이지 않는다.
// 누구나 쉽게 만들 수 있는 코드
// ===============================================

function solution(arr, target) {
const result = [];
for (let num of arr) {
if (result.includes(target - num)) {
return true;
}
// 값을 넣어줘야 다음에 이 값을 사용하는지 판단한다.
set.push(num);
}
return false;
}

// target - num 값이 arr 배열안에 존재만 파악하는 코드
// 이중 for문보다 보기 가독성이 높지만, 똑같이 시간복잡도는 O(n^2)가 발생한다.
// .includes 메서드는 내부를 순회함으로 O(n)을 갖는다.
// ===============================================

function solution(arr, target) {
const set = new Set();
for (let num of arr) {
if (set.has(target - num)) {
return true;
}
// 값을 넣어줘야 다음에 이 값을 사용하는지 판단한다.
set.add(num);
}
return false;
}
// target - num 값이 arr 배열안에 존재만 파악하는 코드
// set을 이용하여 가독성도 높이고 시간복잡도도 줄였다. O(n)
// set.has()와 set.add() 둘다 O(1) 시간복잡도를 가진다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
function solution(string, query) {
let answer = [];

const set = new Set(query);
for (let str of string) {
if (set.has(str)) {
answer.push('True');
} else {
answer.push('false');
}
}
return answer;
}
11 changes: 11 additions & 0 deletions solutions/gwonwoo/0128/[문제20]완주하지못한선수.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
function solution(participant, completion) {
participant.sort(); // 참가자 이름 정렬
completion.sort(); // 통과자 이름 정렬

for (let i = 0; i < participant.length; i++) {
// 통과하지 못한 딱 한 사람만 출력하기 때문에 정렬했을 때 맞지 않은 사람 출력
if (participant[i] !== completion[i]) {
return participant[i];
}
}
}
34 changes: 34 additions & 0 deletions solutions/gwonwoo/0128/[문제21]영어끝말잇기.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
function solution(n, words) {
const answer = [0, 0]; // 정답 배열
const set = new Set(); // 단어 재사용 확인

let count = 0; // 단어 인덱스
let order = 1; // 반복 수
while (count < words.length) {
if (count === 0) {
// 첫번째 문자일 때
set.add(words[count]); // set에 해당 문자 저장
count++;
continue; // 바로 다음 문자 진행
}
// 문자가 중복이 아니고, 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해는지 확인
else if (set.has(words[count]) || check(words[count - 1], words[count])) {
answer[0] = (count % n) + 1; // 사람 순번 계산
answer[1] = order;
break;
}
set.add(words[count]);
count++;

if (count % n === 0) {
// 로테이션이 돌 때 order++
order++;
}
}
return answer;
}

// 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해는지 확인 함수
function check(a, b) {
return a[a.length - 1] !== b[0] ? true : false;
}
22 changes: 22 additions & 0 deletions solutions/gwonwoo/0128/[문제22]전화번호목록.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
function solution(phone) {
phone.sort(); // 문자열 정렬
for (let i = 0; i < phone.length - 1; i++) {
const a = phone[i];
const b = phone[i + 1];

let count = 0;
let answer = true;
for (let j = 0; j < a.length; j++) {
if (a[j] !== b[j]) {
break;
}
count++;
}
if (count === a.length) {
answer = false;
}
if (!answer) return answer;
}

return true;
}
31 changes: 31 additions & 0 deletions solutions/gwonwoo/0128/[문제23]할인행사.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
function solution(want, number, discount) {
let answer = 0;
const obj = {};
// 원하는 상품과 수량을 객체로 매핑
for (let i = 0; i < want.length; i++) {
{
obj[want[i]] = number[i];
}
}

// 마트 할인 기간 - 회원 자격 기간 (할인 기간 중 연속된 10일씩 확인)
for (let i = 0; i <= discount.length - 10; i++) {
const temp = { ...obj };
for (let j = i; j < 10 + i; j++) {
// 해당 상품이 원하는 목록에 있으면 개수 감소
if (temp[discount[j]]) {
temp[discount[j]]--;
}
}
// // 모든 상품이 조건을 만족했는지 확인
let result = true;
for (let key in temp) {
if (temp[key] > 0) {
result = false;
}
}
// result 값이 false이면, answer++
if (result) answer++;
}
return answer;
}
Loading