아놔 백준에서 node js 숫자받을때 왕짜증남 앞으로 숫자 값을 받을 때 마다 Number을 애용합시다 // readline 모듈보다는 fs를 이용해 파일 전체를 읽어 들여 처리하기 const fs = require('fs') const getInput = (filePath) => { return fs .readFileSync(filePath) .toString() .trim() .split(/\n/); } const input = getInput('/dev/stdin'); // 제출시 여기 '/dev/stdin' 으로 변경 // let arr = input[0].split(' ').map(Number); let arr = []; let n = Number(input[0]); for(let i =1;i..
알고리즘
sort함수는 정렬 기준을 지정하지 않을 경우 기본적으로 각 요소를 문자열로 변환하고 유니코드 코드 포인트 순서에 따라 정렬한다 이는 숫자를 정렬할 때 우리가 일반적으로 기대하는 방식과 다를 수 있다.... 그러니까 [ 1, 2, 3 ] 배열을 arr.sort()로 그냥 돌리면 이때는 문제가 없지만 let arr = [10, 5, 20, 2]; 와 같은 배열을 arr.sort() 함수로 돌리게 되면 [ 10, 2, 20, 5 ] 와 같은 결과를 받아버릴 수 있다 따라서 숫자를 js의 sort함수로 내림차순이나 오름차순을 할 경우에는, 꼭 compare함수를 정의해주어야 한다 arr.sort()돌렸다가 열심히 삽질함.. // readline 모듈보다는 fs를 이용해 파일 전체를 읽어 들여 처리하기 cons..
알고리즘 병합정렬은 배열을 정렬하는 효율적인 알고리즘 중 하나이다. 이 알고리즘은 분할 정복을 이용해서 정렬한다! (1) 분할 : 배열을 반으로 나눈다. 이 과정은 배열을 작은 단위의 하위 배열로 계속해서 나누는 과정이다. (2) 정복 : 각 하위 배열을 재귀적으로 정렬한다. 이 정렬은 배열이 충분히 작고 정렬된 상태(length가 1일때까지) 계속 된다. (3) 병합 : 정렬된 하위 배열들을 병합하여 하나의 정렬된 배열을 만든다. 가장 극악의 상황에서도 O(NlogN)의 상황을 보장하는 알고리즘으로 꽤 효율적인 알고리즘이라고 할 수 있다 첨에는 진짜 무슨 소리인지 몰라서 ㅠㅠ 1시간을 넘도록 뚫어져라 쳐다보다가 재귀
import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { // Scanner 객체 생성 Scanner sc = new Scanner(System.in); // 테스트 케이스의 개수 선언 int T = sc.nextInt(); String[] arr = new String[T]; // 문자열 입력받기 for (int i = 0; i < arr.length; i++) { arr[i] = sc.next(); } sc.close(); // 입력받은 문자열을substring으로 0번째 끝번째를 출력한다. for (int i = 0; i < arr.length; i++) { // 만약 입..

트리란? - 트리는 가계도와 같이 계층적인 구조를 표현할 때 사용할 수 있는 자료구조다. - 나무(tree)의 형태를 뒤집은 것과 같이 생겼다. 트리 용어 정리 1) 루트 노드(root node): 부모가 없는 최상위 노드 2) 단말 노드(leaf node): 자식이 없는 노드 트리(tree)에서는 부모와 자식 관계가 성립한다. 3) 관계: 2을 값으로 가지는 노드와 4를 가지는 노드 사이의 관계 4) 깊이(depth): 루트 노드에서의 길이(length) - 트리의 높이(height)는 루트 노드에서 가장 깊은 노드까지의 길이를 의미한다. (상단 그림의 높이는 1) 이진 트리(Binary Tree) - 이진 트리는 최대 2개의 자식을 가질 수 있는 트리를 말한다. 우선순위 큐(Priority Queue..
큐란? - 큐(queue)는 먼저 삽입된 데이터가 먼저 추출되는 자료구조 (* 롤할때 말하는 '큐' 도 여기서 나온 뜻 같다!) - 큐를 연결 리스트로 구현하면, 삽입과 삭제에 있어서 O(1) 을 보장할 수 있다. - 연결 리스트로 구현할 때는 머리(head)와 꼬리(tail) 두 개의 포인터를 가진다. 1) 머리(head): 남아있는 원소 중 가장 먼저 들어 온 데이터를 가리키는 포인터 2) 꼬리(tail): 남아있는 원소 중 가장 마지막에 들어 온 데이터를 가리키는 포인터 삽입할 때는 꼬리(tail) 위치에 데이터를 넣는다 삭제할 때는 머리(head) 위치에서 데이터를 꺼낸다 예제) 전체 연산: 삽입 3 – 삽입 5 – 삭제 – 삽입 7 – 삭제 – 삽입 8 – 삭제 – 삽입 2 – 삽입 9 한쪽에선..
스택이란? - 먼저 들어온 데이터가 나중에 나가는 자료구조 - 흔히 박스가 쌓인 형태를 스택(stack)이라고 한다. - 우리가 박스를 쌓은 뒤에 꺼낼 때는, 가장 마지막에 올렸던 박스부터 꺼내야 한다. 전체 연산: 삽입 3 – 삽입 5 – 삭제 – 삽입 7 – 삭제 – 삽입 8 – 삭제 – 삽입 2 – 삽입 9 이라면 3 5 3 7 3 3 8 3 3 2 3 9 2 3 의 순서로 풀이할 수 있다 (왜 옆으로 나열이 안돼 ㅠ) 연산? 1. 삽입 : O(1) 2. 추출 : O(1) 3. 최상위 원소 : O(1) 4. empty : O(1)
1. 배열(Array) - 가장 기본적인 자료구조 - 여러개의 변수를 담는 공간 장점: 캐시(cache) 히트 가능성이 높으며, 조회가 빠르다. 단점: 배열의 크기를 미리 지정해야 하는 것이 일반적이므로, 데이터의 추가 및 삭제에 한계가 있다. 2. 연결 리스트(Linked List) - 배열과 다르게 크기가 정해져 있지 않고, 리스트의 크기는 동적으로 변경 가능하다. 장점 : 포인터(pointer)를 통해 다음 데이터의 위치를 가리킨다는 점에서 삽입과 삭제가 간편하다. 단점 : 특정 번째의 원소를 검색할 때는 앞에서부터 원소를 찾아야 하므로, 데이터 검색 속도가 느리다. 형태 포인터 : 다음 노드의 메모리 주소를 가리키는 목적으로 사용된다 연결성: 각 노드의 포인터는 다음 혹은 이전 노드를 가리킨다. ..
자료구조란? - 다수의 자료를 담기 위한 구조 - 데이터의 수가 많아질 수록 적절한 자료구조가 필요하다 => 데이터를 효과적으로 저장하고, 처리하는 방법에 대해 알면 불필요한 메모리와 계산을 낭비할 여지가 없다! 자료구조의 종류 1. 선형 구조 - 배열(array) - 연결 리스트(linked list) - 스택(stack) - 큐(queue) 2. 비선형 구조 - 트리(tree) - 그래프(graph) 선형 자료 구조란? - 하나의 데이터 뒤에 다른 데이터가 하나 존재하는 자료구조를 뜻함. - 데이터가 일렬로 연속적으로 연결되어 있다. ex) 스택, 큐, 배열 , 연결리스트 비선형 자료 구조란? - 하나의 데이터 뒤에 다른 데이터가 여러 개 올 수 있는 자료구조를 뜻함. - 데이터가 일직선상으로 연결되..
https://www.acmicpc.net/problem/2562 2562번: 최댓값 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어 www.acmicpc.net 난 박박대가리다 // readline 모듈보다는 fs를 이용해 파일 전체를 읽어 들여 처리하기 let fs = require('fs'); let input = fs.readFileSync('test.txt').toString().split('\n'); // /dev/stdin // let data = input.map(x => Number(x)); // 숫자로 초기..