[TIL] 정글 135일차

신승준·2022년 8월 11일
0

알고리즘

프로그래머스

  1. 신규 아이디 추천(Level 1) (JavaScript)
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의 정확한 사용법을 익히는 것이라는 생각이 들었다.



백준

  1. 2750 수 정렬하기 (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 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으로 제거해주지 않아 계속해서 틀렸었다... 자바스크립트 젠장...!

  1. 2606 바이러스 (Python)
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 등등 좀 지저분해지는 것 같다. 얼른 익숙해지자.



리트코드

  1. 125 Valid Palindrome(문자열 조작) (JavaScript)
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;
};

하루를 마치고

'신규 아이디 추천' 문제를 풀면서 느꼈다. 정글에서 파이썬으로 알고리즘 문제를 풀었기에 자바스크립트로 풀기에는 적응하는 데에 시간이 좀 걸리겠다는 것이다. 따라서 협력사 코딩 테스트를 위해 파이썬을 주력으로 하고 혹시 자바스크립트로만 칠 수 있는 상황을 대비하기 위해 한 번씩 자바스크립트로 푸는 연습을 해야겠다.

그리고 내 힘으로 푼 문제는 다른 사람의 풀이를 참고하지 않았었는데, 내 풀이가 워낙 똥이기에 다른 사람의 풀이를 참고하여 좀 더 효과적인 풀이를 할 필요가 있겠다는 생각이 들었다.

그래도 오랜만에 알고리즘들을 많이 풀어서 뿌듯하기도 했고 재밌기도 했어서 집중이 잘되었다.

profile
메타몽 닮음 :) email: alohajune22@gmail.com

0개의 댓글