알고리즘
function solution(new_id) {
let result = new_id.toLowerCase();
for (let str of result) {
if ((/[a-z]/.test(str) === false)
&& (isNaN(str) === true)
&& (str !== '-')
&& (str !== '_')
&& (str !== '.')) {
result = result.replace(str, '');
}
}
result = result.split('');
for (let i = 0; i < result.length; i++) {
if ((result[i] === '.') && (result[i + 1] === '.')) {
result.splice(i, 1, '!');
}
}
result = result.filter((element) => element !== '!');
if (result[result.length - 1] === '.') {
result.splice(result.length - 1, 1, '');
}
result = result.join('');
if (result[0] === '.') {
result = result.replace('.', '');
}
if (result[result.length - 1] === '.') {
result = result.slice(0, result.length - 1);
}
if (result.length === 0) {
result = 'a';
}
if (result.length >= 16) {
result = result.slice(0, 15);
}
if (result[result.length - 1] === '.') {
result = result.slice(0, result.length - 1);
}
while (result.length < 3) {
result += result[result.length - 1];
}
return result;
}
해당 문제를 풀며, 자바스크립트로 알고리즘 문제를 풀 때 가장 먼저 나에게 필요한 것은 splice와 slice의 차이와 정확한 사용법, filter, reduce, replace, map, forEach의 정확한 사용법을 익히는 것이라는 생각이 들었다.
const fs = require('fs');
// let input = fs.readFileSync('input.txt').toString().trim();
let input = fs.readFileSync('/dev/stdin').toString().trim();
input = input.split('\n');
const totalNumber = Number(input[0]);
const numberArray = input.slice(1).map((element) => Number(element));
function solution(totalNumber, numberArray) {
numberArray.sort((a, b) => a - b)
for (let i = 0; i < totalNumber; i++) {
console.log(String(numberArray[i]));
}
}
solution(totalNumber, numberArray);
와... 처음 입력값에서 toString으로 버퍼 객체에서 문자열로 변환된 값의 양 옆 공백을 trim으로 제거해주지 않아 계속해서 틀렸었다... 자바스크립트 젠장...!
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
computers = int(input())
pairs = int(input())
matrix = [[] for _ in range(computers + 1)]
visited = [0] * (computers + 1)
for _ in range(pairs):
a, b = map(int, input().split())
matrix[a].append(b)
matrix[b].append(a)
def DFS(x):
for i in matrix[x]:
if visited[i] == 0:
visited[i] = 1
DFS(i)
DFS(1)
print(sum(visited) - 1)
왐마 진짜 오랜만에 알고리즘 풀려니 죽어난다. 그래도 감이 조금은 살아있다! 인접행렬도 기억하다니... 후! 파이썬으로 풀었으니 자바스크립트로도 풀어봐야겠다.
2-1. 바이러스 (JavaScript)
const fs = require('fs');
// let input = fs.readFileSync('input.txt').toString().trim();
let input = fs.readFileSync('/dev/stdin').toString().trim();
input = input.split('\n');
const computers = Number(input[0]);
const pairs = Number(input[1]);
input = input.slice(2);
const visited = new Array(computers + 1).fill(0);
const matrix = new Array();
for (let i = 0; i <= computers; i++) {
matrix.push(new Array());
}
for (let i = 0; i < pairs; i++) {
let current = input[i].split(' ').map(element => Number(element));
matrix[current[0]].push(current[1]);
matrix[current[1]].push(current[0]);
}
function solution(matrix, visited) {
function DFS(x) {
for (let value of matrix[x]) {
if (visited[value] === 0) {
visited[value] = 1;
DFS(value);
}
}
}
DFS(1);
return visited.reduce((acc, curr) => {return acc + curr})
}
let result = solution(matrix, visited) - 1;
console.log(result);
와... 같은 로직인데 입력값을 정제하는 데에만 20줄 가량 썼다... 더 짧게 쓸 수 있겠지? 찾아봐야겠다.
파이썬으로는 간단한 메서드만으로 다 풀리는데 자바스크립트로는 map, slice, for of, reduce 등등 좀 지저분해지는 것 같다. 얼른 익숙해지자.
var isPalindrome = function(s) {
let result = s;
result = result.toLowerCase();
result = result.split('');
result = result.filter(element => /[a-z0-9]/.test(element));
result = result.join('');
let left = 0;
let right = result.length - 1;
while (left < right) {
if (result[left] !== result[right]) {
return false;
}
left += 1;
right -= 1;
}
return true;
};
하루를 마치고
'신규 아이디 추천' 문제를 풀면서 느꼈다. 정글에서 파이썬으로 알고리즘 문제를 풀었기에 자바스크립트로 풀기에는 적응하는 데에 시간이 좀 걸리겠다는 것이다. 따라서 협력사 코딩 테스트를 위해 파이썬을 주력으로 하고 혹시 자바스크립트로만 칠 수 있는 상황을 대비하기 위해 한 번씩 자바스크립트로 푸는 연습을 해야겠다.
그리고 내 힘으로 푼 문제는 다른 사람의 풀이를 참고하지 않았었는데, 내 풀이가 워낙 똥이기에 다른 사람의 풀이를 참고하여 좀 더 효과적인 풀이를 할 필요가 있겠다는 생각이 들었다.
그래도 오랜만에 알고리즘들을 많이 풀어서 뿌듯하기도 했고 재밌기도 했어서 집중이 잘되었다.