오늘의 기록:
알고리즘에 너무 약한 것 같아서 얼마전에 구입한 강의에 대한 리뷰를 작성해보고자 한다. 요즘 프로젝트를 하느라 바쁘다는 핑계로 알고리즘 공부에 너무 소홀히했는데... 이번 챌린지를 계기로 다시 조금씩이라도 꾸준히 학습할 수 있도록 하겠다.
1. 백준 문제 입/출력
프로그래머스의 경우 입력값이 알아서 변수에 담겨서 주어지기 때문에 입/출력 값 설정하는 문제가 없었다. 그러나, 백준 문제같은 경우 입력값을 특정 파일에 담아서 넘겨주기만 하기 때문에 그 값을 읽어오는 것부터 문제풀이의 시작이었다. 이전에 혼자 찾아보다가 번거롭게 느껴져서 프로그래머스를 풀만큼 풀고 넘어와야지라고 생각만하다가 이번에 문제번호로 백준문제를 중심으로 강의가 진행되어서 입/출력을 제대로 하는 것부터 공부하기로 하였다.
먼저 출력같은 경우에는 주어진 함수 이름의 리턴값으로 문제에서 원하는 배열이나 문자열 또는 숫자와 같은 자료형을 출력하는 경우도 있지만 백준에서는 기본적으로 console.log를 통해 원하는 답을 콘솔에 찍히도록 하면 된다.
입력의 경우 조금 복잡하게 처음에는 느껴질 수 있는데, 핵심을 정리하면 문자열 형태로 주어진 데이터를 fs모듈을 통해 읽어온 뒤 숫자로 사용하고 싶은 경우에는 숫자로 변환하여 처리해주고 출력할 때 원하는 자료형으로 변환하여 출력하면 된다.
기본적인 사칙연산 문제를 통해 강의내용을 정리해보자. 문제번호를 검색해서 다음과 같이 문제를 찾을 수 있고, 로직 자체를 작성하는 것은 어려움이 없지만 쉬운문제로 낯선 입출력 방식을 익혀보았다.
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split(' ')
console.log(Number(input[0])+Number(input[1]))
간단한 사칙연산이지만 파일에서 입력 값을 제대로 읽어와서 출력해주어야한다.
2. 문제풀이의 조건
각 문제마다 입출력에 대한 조건이 주어진다. "입력 값의 범위는 0-10만 사이이다" 이런 정보가 주어지면 그 정보에 따라 처리방식이 달라질 수도 있고, 경우에 따라서는 특정복잡도를 만족하지 못하면 런타임 에러가 나게된다. 거의 모든 문제풀이가 그렇듯 통제된 상황 아래에서 조건에 만족하는 풀이방법을 찾아야 하는 것.
대략적으로 빅오(O) 계산법에 따르면 다음과 같다.
N의 범위가 500인 경우 : 시간복잡도가 O(N^3)인 알고리즘까지 허용된다.
N의 범위가 2,000인 경우 : 시간복잡도가 O(N^2)인 알고리즘까지 허용된다.
N의 범위가 100,000인 경우 : 시간복잡도가 O(N*logN)인 알고리즘까지 허용된다.
N의 범위가 10,000,000인 경우 : 시간복잡도가 O(N)인 알고리즘까지 허용된다.
따라서, 사칙연산은 O(N)까지도 안가고 보통 O(1)로 끝나지만 O(N)으로 짠다고 가정해보자. 수가 입력되면 첫번째 수에서 1을 하나씩 빼면서 두 번째 입력된 수와 비교하고 해당 카운트를 리턴하여 둘의 크기 차이를 파악하는 로직을 만들어본다. 천만이 넘는 차이의 두 숫자가 들어오는 경우? 시간복잡도가 O(N)으로 구현되어 런타임 오류가 날 가능성이 존재한다. 단순한 뺄셈도 이렇게 런타임 오류를 낼 수 있다. 따라서 난이도가 올라가면 올라갈수록 시간복잡도에 대한 고려때문에 매우 머리가 아파질 수 있다. 하지만 지금 쉬운문제를 푸는 단계에서는 시간복잡도가 크더라도 일단 푸는 것 자체에 집중해보는 것이 더 좋다.
오늘은 문제풀이를 위한 기본 개념을 익히는데 더 비중이 있는 시간이었고 다음시간부터 본격적으로 문제를 풀면서 알고리즘에 대한 내용도 함께 알아보자.
https://fastcampus.co.kr/dev_online_upjscodingtest
UPSKILL : Javascript 코딩테스트 131개 예제 & CS지식으로 끝내기 | 패스트캠퍼스
25시간 대비 과정 / '코테 레전드' 유튜버 강사님께 핵심만 배우고 빠르게 합격하세요.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'study > Challenge' 카테고리의 다른 글
패스트캠퍼스 JavaScript 코딩테스트 131개 예제 & CS지식으로 끝내기 강의 3주차 (1) | 2023.05.02 |
---|---|
패스트캠퍼스 JavaScript 코딩테스트 131개 예제 & CS지식으로 끝내기 강의 2주차 (0) | 2023.04.27 |
[Challenge / day-30] 컴포넌트 만들기 - 그룹생성 컴포넌트 (0) | 2023.03.21 |
[Challenge / day-29] CSS flex (0) | 2023.03.20 |
[Challenge / day-28] Bootstrap 레이아웃 (1) | 2023.03.19 |