일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 반응형 웹
- 애플
- 배포
- binary
- 아이폰
- 데이터베이스
- react
- 컴퓨터
- 운영체제
- db
- ECMAScript2015
- ES6
- styled-components
- 알고리즘
- 맛집
- 자바
- 식물키우기
- string
- LeetCode
- 리액트
- 정규표현식
- Algorithm
- c++
- git
- codewars
- Javascript
- 기억장치
- 자바스크립트
- java
- ECMAScript6
- Today
- Total
목록자료구조 · 알고리즘 (9)
에브리 저장소
문제 링크 이 문제는 배열로 표현된 2진수를 10진수로 변환하는 문제입니다. Testing: [0, 0, 0, 1] ==> 1 Testing: [0, 0, 1, 0] ==> 2 Testing: [0, 1, 0, 1] ==> 5 Testing: [1, 0, 0, 1] ==> 9 Testing: [0, 0, 1, 0] ==> 2 Testing: [0, 1, 1, 0] ==> 6 Testing: [1, 1, 1, 1] ==> 15 Testing: [1, 0, 1, 1] ==> 11 문자열 이진수를 십진수로 변환하는 방법 자바스크립트에는 문자열을 숫자로 바꿔주는 메서드인 parseInt가 존재합니다. parseInt에 인자로 숫자로 변환할 문자열과 radix를 적어, 몇 진수로 표현되어 있는지 알려주면 변환하여..
문제 링크 이 문제는 올바른 PIN 코드 입력을 찾아내는 문제입니다. string으로 들어오는 입력을 받아 올바른 PIN 코드인지 아닌지를 boolean으로 반환하면 됩니다. validatePIN("1234") === true validatePIN("12345") === false validatePIN("a234") === false 정규표현식을 써서 간단하게 해결할 수 있습니다. 정규표현식 문법(?) 중, \d는 digit를 의미하여 0~9 사이가 존재하는지 검사가 가능합니다. 그리고 중괄호를 사용하여, 몇 개 포함되어 있는지를 검사할 수 있습니다. 이 문제를 풀기 위해 다음과 같은 정규표현식을 만들 수 있겠습니다. /^(\d{4}|\d{6})$/ ^, $는 각각 시작과 끝을 의미하고 |는 또는(OR)..
문제 링크 이 문제는 설명이 없습니다.(?) accum이라는 메서드에 문자열 인자를 넣었을 때의 출력 값 예시를 보여주고 동일하게 동작하도록 구현하는 문제입니다. 규칙을 찾아내기 어려운 문제는 아니었습니다. accum("abcd") -> "A-Bb-Ccc-Dddd" accum("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy" accum("cwAt") -> "C-Ww-Aaa-Tttt" 규칙을 분석하면 각 글자들의 순서만큼 해당 글자를 나열하고, 제일 앞일 때는 대문자가 됩니다. 그리고 이 문자들은 '-' 로 연결된다. 정리하면 다음과 같습니다. 입력받은 문자열을 한 글자씩 나눠 배열을 만든다. 각 글자마다 대문자, 소문자를 만들어 저장합니다. 반환할 변수에 대문자를..
문제 링크 https://leetcode.com/problems/longest-substring-without-repeating-characters/ 풀이 이 문제는 문자열에서 중복 없이 가장 긴 substring의 길이를 반환하는 문제이다. 내가 접근한 방식은 완전 탐색이다. 자신보다 뒤에 있는 문자열들을 순회하면서 중복이 발생하기 전까지의 길이를 찾아 저장해놓은 max length와 비교하는 로직을 작성했다. O(N^2)의 시간 복잡도를 가지기 때문에 상대적으로 너무 느리다. 다른 사람들의 풀이를 보았고, O(N)으로 푸는 코드를 찾았다. 이 코드는 각 문자열을 map이라는 객체에 저장하면서 value로 이 문자가 가장 마지막으로 나온 index를 저장한다. 이로 인해 한번 순회로 중복 없는 최대 길..
문제 링크 https://leetcode.com/problems/sum-of-two-integers/ 풀이 이 문제에서는 +, - 연산자를 사용하지 않고 두 인자의 합을 반환하는 함수를 만들어야 한다. 문제의 조건을 확인하고 비트 연산자를 써야겠다고 생각했으나, 어떤 연산자를 써야 할까 고민했다. 정확한 덧셈을 위해서 Carry와 이를 제외한 합을 알아야 한다. Carry를 알기 위해 사용할 수 있는 비트 연산자는 AND이다. 둘 다 1일 때만 1이므로 AND의 결과가 1이라면 Carry가 발생했음을 알 수 있다. Carry를 제외한 합은 XOR 연산자로 알 수 있다. 둘 중 하나만 1일 때 XOR의 결과가 1이기 때문이다. 실제로 컴퓨터가 덧셈을 AND, XOR 연산자를 통해서 한다고 한다. 덧셈을 실..
문제를 풀다가 문자를 정수로 바꾸는 걸 까먹고 안해서 계속 에러가 나는 걸 꽤나 헤맸다. 뒤늦게 숫자가 아스키 코드라는 것을 깨닫고 C++에서 char 데이터형을 int로 변환하는 법을 검색해 보았다. 스택 오버플로우에 쉬운 방법이 있어 기록해 놓는다. '1'의 문자를 int 1로 수정하고 싶다면 아래와 같이 작성할 수 있다. char ch1 = '1'; int num1 = ch1 - '0'; cout
처음 c++로 알고리즘 문제를 풀었을 때 낯설었던 것 중 하나는 vector를 순회해야 할 때였다. 배열처럼 인덱스로 접근하면 편할 텐데, 그것이 안되니 이상하고 어렵게만 느껴졌다. '그럼 배열을 쓰면 되지'라는 생각이 들지만 배열에는 없는 vector의 메서드들이 필요한 순간들이 있어서 vector를 잘 다루는 것이 중요하다고 생각했다. 까먹지 않기 위해 C++에서 vector를 순회하는 방법을 기록한다. 먼저 vector를 순회하기 위해 iterator를 선언해줘야 한다. iterator는 반복자라고 부르기도 하는데, STL 컨테이너의 메모리 주소를 가리킬 때 사용된다. vector의 시작과 끝의 위치를 반환하는 함수인 begin()과 end()를 활용해 아래와 같이 코드를 짜면 vector의 요소들..
문제 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다. 입력 첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. 출력 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다. 풀이 내용 정리 먼저 vector를 사용해서 각 테스트 케이스마다 점수들을 담았다. for(int i=0; i> score; scores.push_back(score); } 실수한 부분은 scores를 clear 하지 않고 resize만..
[알고리즘] 에라토스테네스의 체(소수 구하는 알고리즘) 자바 구현 안녕하세요. 오늘은 소수를 찾는 방법인 '에라토스테네스의 체'라는 알고리즘에 대해 알아보겠습니다. 알고리즘 진행은 아래와 같습니다. 1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다.2. 2는 소수이므로 오른쪽에 2를 쓴다.3. 자기 자신을 제외한 2의 배수를 모두 지운다.4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다.5. 자기 자신을 제외한 3의 배수를 모두 지운다.6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다.7. 자기 자신을 제외한 5의 배수를 모두 지운다.8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다.9. 자기 자신을 제외한 7의 배수를 모두 지운다.10. 위의 과정을 반복하면 ..