반응형

https://www.hackerrank.com/challenges/new-year-chaos/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=arrays

 

New Year Chaos | HackerRank

Determine how many bribes took place to get a queue into its current state.

www.hackerrank.com

이번에 풀어본 문제입니다.

문제) 사람들이 일렬로 물건을 사기 위해 줄을 서있습니다. 이 때, 모든 사람들은 앞 사람들에게 돈을 주고 자리를 바꿀 수 있고, 특정 사람이 다른 사람을 매수할 수 있는 최대 횟수는 2회입니다.(즉, 자신의 자리보다 최대한 2칸까지 앞으로 갈 수 있습니다.) 숫자들의 List가 주어질 때, 매수가 일어난 최소 횟수를 구하시오.

 

[예시]

 

초기 상태 : [1, 2, 3, 4, 5]

최종 상태 : [2, 1, 5, 3, 4]

* 엄청나게 큰 Input이 테스트 항목에 있으므로, 단순히 풀기만 해서는 안됩니다.(여기서 많은 시간을 보냈습니다. 사실 답을 찾지 못해서 discussion에 들어가서 힌트를 얻었습니다 ㅠㅠ)

 

1. 방법

* (매수가 일어난 총 횟수) = (각각의 사람들이 매수당한 횟수의 총 합)

  -> 각 사람들이 매수당한 횟수는 특정 사람(x)보다 앞에 있지만 뒷번호를 가진 사람(y: y>x)을 찾으면 됩니다.

  -> 특정 사람의 순서(x)보다 뒷 번호를 가진 사람(y : y>x)은, 특정 사람의 원래 자리(x) 보다 1자리 앞(x-1)까지 갈 수 있습니다.(y : y≥x-1)

     (이 부분을 이해하는 것이 중요합니다. 뒤에 있던 사람이 매수를 하면 뒤에 있던 사람은 자리 (x)로 오게 됩니다.)

  -> 즉, 원래 특정 사람이 x에 위치해 있었고 현재 위치가 i라면, x-1부터 i-1까지 위치에 x보다 큰 숫자가 몇개 있는지 찾으면 됩니다.

 

코드는 매우 간단하므로 생략하겠습니다. -!

반응형

'Computer Science > 알고리즘' 카테고리의 다른 글

HackerRank - Array Manipulation  (0) 2020.03.31
Hackerrank - Minimum Swaps2  (0) 2020.03.31
HackerRank - Statistics 1  (0) 2020.03.10
Hackerrank - Nested Logic  (0) 2020.02.24
Hackerrank - Running Time and Complexity  (0) 2020.02.23
반응형

Weighted Mean을 구하는 문제입니다.

숫자 행렬 X = [1, 2, 3]

가중치 행렬 W = [4, 5, 6]

과 같이 행렬이 주어지면 Weighted Sum은 (1x0.1 + 2x0.2 + 3x0.3)/(4 + 5 + 6) 과 같이 구할 수 있습니다.

 

https://www.hackerrank.com/challenges/s10-weighted-mean/problem

 

Day 0: Weighted Mean | HackerRank

Compute the weighted mean.

www.hackerrank.com

 

반응형

'Computer Science > 알고리즘' 카테고리의 다른 글

Hackerrank - Minimum Swaps2  (0) 2020.03.31
Hackerrank - New Year Chaos  (0) 2020.03.16
Hackerrank - Nested Logic  (0) 2020.02.24
Hackerrank - Running Time and Complexity  (0) 2020.02.23
Hackerrank - More Linked Lists  (0) 2020.02.20
반응형

https://www.hackerrank.com/challenges/weather-observation-station-6/problem

 

Weather Observation Station 6 | HackerRank

Query a list of CITY names beginning with vowels (a, e, i, o, u).

www.hackerrank.com

동일한 테이블 STATION에서 CITY NAME이 모음(a,e,i,o,u)로 시작하는 것들을 찾아내는 문제입니다.

 

SELECT CITY

FROM STATION S

WHERE S.CITY REGEXP '^[aeiou]';

 

와 같은 형식으로 찾아낼 수 있습니다. 정규표현식은 다 비슷비슷한가보군요.

비슷한 문제가 두 문제 더 있었습니다.

 

1) aeiou로 끝나는 CITY NAME을 찾아라

SELECT CITY

FROM STATION S

WHERE S.CITY REGEXP '[aeiou]$';

 

→ 정규표현식에서 $는 끝을 의미합니다. 따라서 '[aeiou]$'는 aeiou 중 하나로 끝나는 문자열을 의미하게 됩니다.

 

2) aeiou로 시작하고, aeiou로 끝나는 CITY NAME을 찾아라.

 

SELECT CITY

FROM STATION S

WHERE S.CITY REGEXP '^[aeiou].*[aeiou]$';

 

→ .은 문자열 한개를 의미하고, *는 앞의 패턴이 0번 이상 반복됨을 의미합니다. 즉 .*는 0개 이상의 문자가 반복된다는 뜻이죠. 즉, "^[aeiou]" aeiou 중 하나로 시작하며, ".*" 중간에 0개 이상의 문자를 가지고, "[aeiou]$' aeiou로 끝나는 CITY NAME을 찾아라. 라는 뜻입니다.

 

 

** 정규표현식 **

 

1) . : 문자열 1개

2) * : 별표 앞의 패턴이 0회 이상 반복

  ex) .* : 문자가 0회 이상 반복

3) ^ : 시작

4) $ : 끝

5) [문자열] : 괄호 안에 있는 문자열에 대하여 ~

  ex) ^[aeiou] : aeiou 중 하나로 시작

6) [^문자열] : 괄호 안에 있는 문자열을 제외하고 ~ 

7) {n} : n회 반복

8) {m, n} : 최소 m회, 최대 n회 반복

 

반응형

'DB > SQL' 카테고리의 다른 글

Hackerrank - Type of Triangle  (0) 2020.03.24
Hackerrank - SQL  (0) 2020.03.17
Hackerrank[SQL] - Weather Observation Station 5  (1) 2020.03.06
Hackerrank[SQL] - Weather Observation Station 4  (0) 2020.03.06
반응형

살아가면서 큰 돈을 만지려면 투자 혹은 창업! 두 가지 방법밖에 없다고 생각합니다.

[투자 공부 + 코딩 공부]를 위해 투자 프로젝트를 아래와 같이 3가지 단계로 시작해봅니다.

1. Data Gathering

 

1. 데이터 종류

    1.1) 회사 데이터

      가) 회사명(완료)

      나) 종목코드(완료)

      다) 산업군(완료)

 

    1.2) 일별 KOSPI 데이터 : 

    1.3) 일별 시장지표 : 

 

    1.4) KOSPI 기업들 재무제표

    1.5) 일별 미국 증시 데이터 : To Be Updated

 

2. 수집 방법

  1. 라이브러리 : Data Gathering에 사용한 라이브러리는 다음과 같습니다.

  [FinanceDataReader, pandas_datareader, pymysql, requests, BeautifulSoup, selenium]

 

    1) FinanceDataReader(fdr) : 일반적인 금융 데이터를 수집한다. 

https://financedata.github.io/posts/finance-data-reader-users-guide.html

 

FinanceDataReader 사용자 안내서

FinanceDataReader 사용자 안내서

financedata.github.io

    2) pandas_datareader(pdr) : 일반적인 금융 데이터를 수집한다.

https://pandas-datareader.readthedocs.io/en/latest/

 

pandas-datareader — pandas-datareader 0.8.0+4.gec799a0 documentation

Usage Starting in 0.19.0, pandas no longer supports pandas.io.data or pandas.io.wb, so you must replace your imports from pandas.io with those from pandas_datareader: from pandas.io import data, wb # becomes from pandas_datareader import data, wb Many func

pandas-datareader.readthedocs.io

    3) pymysql : mysql 서버를 python을 활용하여 접근한다.(수집한 정보를 Local MYSQL 서버에 저장한다.)

    4) requests : 일반적으로 크롤링에 사용되는 라이브러리, 웹페이지에 요청을 보내고 응답을 받는다.

    5) BeautifulSoup : 일반적으로 크롤링에 사용되는 라이브러리, requests를 통해 받은 응답을 정제한다.

    6) selenium : requests로 크롤링이 불가능한 경우(ex : click이 필요할 때) 사용한다.

 

  회사 정보, KOSPI, 시장지표 대부분 데이터는 FinanceDataReader, pandas_datareader를 사용하면 데이터를 얻을 수 있습니다. 사용법은 위의 Reference를 참고하시기 바랍니다.

 

 

  2. 크롤링 :

fdr, pdr을 통해 구할 수 없는 일부 데이터(ex : 원유 가격, 재무제표)등을 구하기 위한 방법입니다. 웹페이지에서 직접 정보를 모으는 것을 말하며, requests, BeautifulSoup, selenium 라이브러리를 활용합니다.

      

      

 

2. 관계형 데이터베이스에 저장 :

MYSQL을 사용하여 관계형 데이터베이스에 저장합니다.(추후 클라우드로 이동 가능)

 

 

3. 분석 

 

데이터 수집이 완료되면 자동화시킨 후 클라우드 상에서 분석을 진행할 예정입니다.-!

 

 

반응형

'토이 프로젝트' 카테고리의 다른 글

[Step 1] 교통망 시각화하기  (0) 2018.07.27
반응형

패스트 캠퍼스의 운영체제 수업을 듣고 있으며, 하루에 5개씩 듣는 걸 목표로 시작했습니다.

(약 15분씩 진행되며, 말이 느리셔서 2배속으로 들어도 무리 없는듯)

 

* 운영체제(Operating System)

 

Mac, Windows, Unix 같은 소프트웨어를 운영체제라고 합니다.

 

1. 운영체제의 역할

 

1) 응용 프로그램 관리(프로그램 실행/종료, 권한 및 사용자 관리)

2) 시스템 자원 관리 및 효율적 분배

3) 사용자와 컴퓨터 간의 커뮤니케이션 지원

 

2. 시대적 흐름에 따른 운영체제의 발전

 

- 1950년대 : 최초의 컴퓨터라 불리는 애니악의 출현, 당시에는 운영체제의 개념이 없었고, 응용프로그램 1개가 직접 컴퓨터 자원을 제어했다.

- 1960년대 초반 : 배치처리 시스템과 같은 운영체제가 등장하기 시작했다. 프로그램을 등록해놓고 순차적으로 실행이 가능해졌으나, 프로그램 순서에 따른 실행시간 및 응답시간의 비효율성이 큰 것이 문제였다.

- 1960년대 후반 : 시분할시스템, 멀티태스킹이라는 개념이 등장했다.(두 개념은 매우 비슷하며, 동일한 의미로 쓰이기도 한다고 한다.) 

  * 시분할 시스템 : CPU 점유 시간을 잘게 쪼개어, 다중 사용자를 지원하고 컴퓨터 응답시간을 최소화하는 시스템

  * 멀티태스킹 : 응용프로그램을 여러 단계로 쪼개어, 단일 CPU에서 여러 응용 프로그램의 병렬 실행을 가능하게 하는 시스템. 마치 동시에 여러 프로그램이 실행되는 것처럼 사용자가 느끼게 한다.

  * 멀티프로그래밍

- 1970년대 후반 : UNIX가 개발되었으며, 본격적으로 현대적인 운영체제가 등장하였다.

- 1980년대 : 개인용 컴퓨터 환경이 구축되었으며, GUI 환경의 한 운영체제가 등장하였다.

- 1990년대 : 다양한 응용프로그램이 개발되었고, World Wide Web이 등장하여 세계화가 시작되었다.

- 2000년대 이후 : 오픈소스가 활성화되었고, 현재많이 사용되는 운영체제는 Linux, Mac, Windows이다.

반응형
반응형

https://www.hackerrank.com/challenges/weather-observation-station-5/problem

 

Weather Observation Station 5 | HackerRank

Write a query to print the shortest and longest length city name along with the length of the city names.

www.hackerrank.com

이번 문제는 MySQL을 통해 아래와 같은 STATION이라는 테이블에서, CITI name(Column명 CITY)이 가장 짧은 것과 긴 것을 출력하는 것입니다. 이때 출력 시 주의할 점은, 같은 길이의 CITY name을 가진 것들에 대해서는 알파벳 순서가 가장 빠른 것을 출력하면 됩니다.

 

Output : (CITY name), (Length of the CITY name)

 

 

SELECT , CHAR_LENGTH(), ORDER BY (DESC, ASC)를 활용하여 문제를 해결하였습니다.

 

1. 방법

  1) CITY Column의 길이 중 가장 가장 짧은 것, 긴 것을 뽑는다.

     SELECT CITY, MIN(CHAR_LENGTH(CITY)) FROM STATION;

     SELECT CITY, MAX(CHAR_LENGTH(CITY)) FROM STATION;

 

       문자열의 길이를 출력하는 방식은 2가지가 있습니다.

     * LENGTH() : BYTE 수를 기준으로 문자열의 길이를 출력합니다.

     * CHAR_LENGTH() : 글자 수를 기준으로 문자열의 길이를 출력합니다.

 

  2) 같은 길이를 가진 문자열이 여러 개 있을 수 있으므로, 알파벳 순으로 정렬하여 출력한다.

     SELECT CITY, CHAR_LENGTH(CITY)
     FROM STATION
     ORDER BY 2 ASC,1 LIMIT 1;
     SELECT CITY, CHAR_LENGTH(CITY)
     FROM STATION
     ORDER BY 2 DESC,1 DESC LIMIT 1;

 

       정렬은 ORDER BY로 진행할 수 있습니다. ASC는 오름차순, DESC는 내림차순입니다. 길이가 가장 짧은 것은 CHAR_LENGTH(CITY)를 오름차순으로 정렬한 뒤 1개만 가져오면 됩니다. 이 때 ORDER BY 뒤에 CHAR_LENGTH, CITY 순으로 입력하면, 우선순위를 가지고 정렬할 수 있습니다. 

반응형

'DB > SQL' 카테고리의 다른 글

Hackerrank - Type of Triangle  (0) 2020.03.24
Hackerrank - SQL  (0) 2020.03.17
Hackerrank[SQL] - Weather Observation Station 6  (0) 2020.03.10
Hackerrank[SQL] - Weather Observation Station 4  (0) 2020.03.06
반응형

https://www.hackerrank.com/challenges/weather-observation-station-4/problem

 

Weather Observation Station 4 | HackerRank

Find the number of duplicate CITY names in STATION.

www.hackerrank.com

문제 : 아래와 같이 구성된 Station 테이블에서 (전체 데이터 수) - (중복되지 않은 CITY Name 데이터 수) 를 구하는 문제이다.

방법 : 

  1. (전체 데이터 수) 저장

  SET @A = (SELECT COUNT(*) FROM STATION);

 

  2. (중복되지 않은 CITY Name 데이터 수) 저장

  SET @B = (SELECT COUNT(DISTINCT(CITY)) FROM STATION);

 

  3. 빼고 출력

  SELECT @A-@B;

 

MySQL에서 변수 저장하는 방식(@var = num;)을 알게 되었습니다.

반응형

'DB > SQL' 카테고리의 다른 글

Hackerrank - Type of Triangle  (0) 2020.03.24
Hackerrank - SQL  (0) 2020.03.17
Hackerrank[SQL] - Weather Observation Station 6  (0) 2020.03.10
Hackerrank[SQL] - Weather Observation Station 5  (1) 2020.03.06
반응형

CS의 기본을 다지기 위해 조금씩 듣기로 한 수업입니다.

 

오늘은 컴퓨터의 구성 요소 및 실행 방법에 대해 간단히 수업내용을 정리해보았습니다.

 

1. 컴퓨터의 구성 요소 및 역할

 

컴퓨터의 구성 요소는 아래와 같이 다섯 가지(역할)로 나누어볼 수 있습니다.

많은 컴퓨터의 구성요소들은 아래의 다섯 가지 중 부분들을 조합하여 역할을 수행합니다.

 

1) 입력 : 데이터를 메모리에 쓰는 역할

2) 출력 : 메모리로부터 데이터를 읽는 역할

3) 메모리 : 데이터가 저장되는 공간

  3.1) 스택 : 지역변수를 선언하는 공간으로 정적으로 공간이 할당됩니다. 프로그램 종료 시 자동으로 소멸됩니다.

  3.2) 힙 : 동적으로 할당된 메모리 영역으로, 개발자가 직접 해제해줘야 합니다.(자동 소멸 X)

4) 데이터 패스 : 데이터의 이동 경로

5) 제어 유닛 : 컴퓨터의 실행을 제어하는 역할

 

예를 들어 CPU 같은 프로세서는 (데이터 패스) + (제어 유닛)으로 나타낼 수 있습니다.(레지스터같은 약간의 메모리도 가지고 있죠) 제어 유닛에서 제어 신호를 생성하여 순서대로 명령을 실행하게 되는데, 명령어가 주어지면 ALU에서 연산을 수행하고 이 수행 과정에서의 데이터가 레지스터에 저장됩니다.

 

* 메모리 계층구조

 : 속도가 빠른 메모리는 비싸기 때문에, 컴퓨터의 메모리는 서로 다른 속도와 크기를 갖는 여러 계층의 메모리로 구성되어 있습니다.

속도 : 레지스터 > 캐쉬 > 램 > SDD > HDD

위와 같은 순서로 속도가 빠르게 되며, 빠를수록 가격이 비싸기 때문에 용량이 작고, 자주 사용되는 메모리입니다.

 

2. 기계어, 어셈블리어, 고급 언어

 

  우리가 일반적으로 아는 C, Java, Python 과 같은 언어는 고급언어라고 불립니다. 인간이 이해하기 쉽고, 인간에 의해 작성된 알고리즘이 컴퓨터를 제어하게 됩니다. 일반 사람들도 코드만 보고는 이해하기 어려운 알고리즘을 컴퓨터는 어떻게 이해하고 작업을 수행하는걸까요?

  우리가 고급 언어로 작성한 알고리즘은 컴파일러에 의해 어셈블리어로 변환되고, 어셈블리어는 다시 기계어로 변환됩니다. 이 때 기계어는 0과 1만의 조합으로 나타내지게 되어, 컴퓨터는 이를 수행할 수 있습니다.

  어셈블리어에 대해 조금 더 공부해보면, 어셈블리어는 아래와 같이 opcode(실행코드), operand(실행코드)로 구성되어 있습니다. opcode에는 ADD, BRANCH 같은 명령어를 넣고, ADDRESS는 해당 연산을 수행할 공간(변수 혹은 주소의 절대값)을 입력하게 됩니다. 우리가 C언어로 작성하는 코드들은 컴파일러를 통해 이런 명령어들로 변환되게 됩니다.

 

http://egloos.zum.com/dreamform/v/2805479

 

3. 컴퓨터의 성능과 전력

 

  우리는 영상이나 인터넷 서핑 등 다양한 목적을 위해 컴퓨터를 구매합니다. 이런 다양한 목적을 수행하는데 걸리는 시간이 짧아질수록 시간은 절약되기 때문에, 우리는 컴퓨터의 성능(과 가격)을 고려하여 구매를 결정합니다. 가격이 높을수록 컴퓨터의 성능은 좋아지겠지만, 컴퓨터의 성능이란 것은 무엇일까요?

  컴퓨터의 성능을 평가하는 다양한 지표가 있지만, 대표적으로 응답시간과 처리량을 바탕으로 평가합니다. 응답 시간은 특정 작업을 수행하는데 걸리는 시간이며, 처리량은 단위시간 내에 처리할 수 있는 작업의 양을 뜻합니다. 응답 시간과 처리량은 일반적으로 반비례하며, 짧은 시간 안에 최대한 많은 작업을 처리하는 컴퓨터의 성능이 좋다고 말합니다. 그렇다면 이런 응답 시간과 처리량은 어떤 기준으로 평가할 수 있을까요?

  컴퓨터는 우리에게 시간과 같은 개념으로 클럭이란 개념을 가지고 있습니다. 클럭이란 아래와 같은 일정 주기를 가지고 0과 1을 왔다갔다하는 신호를 말합니다. 이 신호가 1이나 0에 이를 때, 컴퓨터는 특정 작업의 수행을 시작할 수 있습니다. 예를 들어, Clock이 High(1)이 되면 작업을 수행하고, 작업이 끝나면 대기하다가 다른 작업이 들어오면 다음 클럭이 High(1)이 될 때 작업을 시작합니다. 즉, 클럭이란 컴퓨터가 작업을 수행하는 최소 단위(시간)이 되는 것이죠.

https://www.quora.com/I-understand-that-CPU-clock-speeds-maximize-at-around-3-to-8-GHz-depending-on-cooling-but-what-about-the-clock-speeds-of-individual-transistors-Are-individual-transistor-going-to-maximize-at-the-same-speeds-as-the

  클럭의 속도가 높아질수록 컴퓨터는 시간을 더 잘게 쪼개서 작업을 수행할 수 있게 되어, 짧은 시간 안에 더 많은 작업을 수행할 수 있습니다. 하지만 클럭이 높아지면 높아질수록 소비전력과 발열량이 늘어나게 됩니다. 클럭 또한 트랜지스터의 작동으로 인해 생성되는 것인데, 소비전력은 트랜지스터의 스위칭 횟수에 비례하기 때문입니다. 더 많은 스위칭이 일어날수록 소비하는 전력과 발열량은 늘어나게 됩니다. 따라서 클럭의 수는 일정하게 유지하는 동시에, 코어의 수를 늘려 전력을 낮추는 방법을 사용하여 CPU는 발전해왔습니다. 

  클럭이 동일하더라도 CPU의 개수를 늘려서, 여러개의 CPU에서 병렬적으로 작업을 수행하면 속도는 더욱 빨라지겠죠. 하지만 병렬화도 최적화되지 않으면 싱글코어나 다름없기 때문에, 이 병렬화 작업을 최적화해주는 작업은 매우 어렵다고 합니다.

  이렇게 발전해나가는 CPU들 중 우리가 많이 들어본 i3, i5, i7에 대해서 알아보겠습니다.

 

[ i3 - 2코어 4스레드]

[ i5 - 4코어 4스레드]

[ i7 - 4코어 8스레드]

 

위와 같이 구성되어 있다고 합니다. 스레드(Thread)는 프로그램을 구성하는 최소 단위로, 나중에 더 자세히 알아보도록 하겠습니다. i3가 싸고 i7이 비싼 것은 , 코어 수와 스레드 수가 증가함에 따라 병렬화하여 작업을 더 효율적으로/빠르게 처리할 수 있기 때문입니다.

 

4. 컴퓨터의 연산

 

  위의 내용들을 바탕으로 컴퓨터는 덧셈/뺄샘 등의 연산을 진행하게 되는데, 특이한 소수점 연산에 대해 알아보기로 하겠습니다. 소수점을 계산하는 방법은 아래와 같은 두 가지 방법이 있으며, 일반적으로 부동소수점 방식이 사용됩니다.

 

1) 부동소수점 : 부호, 가수, 밑수, 지수로 소수를 나타내는 방법. 

https://m.blog.naver.com/PostView.nhn?blogId=kmc7468&logNo=220990920730&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

2) 고정소수점 : 소수점의 자릿수를 고정하여 소수를 나타내는 방법(정밀도가 낮고 좁은 범위의 수만 나타낼 수 있다.)

 

* 해저드 : 다음 클럭에 실행되어야 할 명령어가 실행될 수 없는 상황

  1) 구조적 해저드 : 하드웨어의 한계로 명령어가 실행될 수 없는 상황

  2) 데이터 해저드 : 다른 명령어가 끝나기를 기다려야 하기 때문에 지연이 생기는 경우(다른 연산의 결과를 활용)

  3) 제어 해저드 : 명령어의 주소 흐름이 파이프라인이 기대한 것과 다른 상황(분기의 경우 어떤 명령어가 실행될 지 모름)

 

반응형

+ Recent posts