디지털 사이니즈란?

디지털 사이니즈란 네트워크를 통해 원격제어가 가능한 디지털 디스플레이를 공공장소나 상업공간에 설치하여 정보, 엔터테인먼트, 광고, 등을 제공하는 디지털 미디어이다.

 

디지털 워터마킹이란

디지털 워터마킹은 사진이나 동영상 같은 각종 디지털 데이터에 저작권 정보와 같은 비밀 정보를 삽입하여 관리하는 기술을 말한다. 그림이나 문자를 디지털 데이터에 삽입하며 원본 출처 및 정보를 추적할 수 있으며, 삽입된 워터마크는 재생이 어려운 형태로 보관된다.

 

디지털핑거프린팅(Fingerprinting)
정보를 디지털 콘텐츠에 삽입하는 측면에서는 워터마킹과 동일하다고 볼 수 있으나, 저작권자나 판매자의 정보가 아닌 콘텐츠를 구매한 사용자의 정보를 삽입함으로써 이후에 발생하게 될 콘텐츠 불법 배포자를 추적하는 데 사용하는 기술이다.
워터마킹과는 달리 판매되는 콘텐츠가 구매한 사용자들마다 조금씩 다른 정보를 가지므로 콘텐츠가 불법적으로 재배포될 경우 핑커프린팅된 정보를 추출하여 구매자를 식별하고 법적인 조치를 가할 수 있다.
즉, 소유권에 대한 인증 뿐 아니라 개인 식별이 가능하다.

요구사항
워터마킹 : 비가시성, 견고성, 유일성
핑거프린팅 : 비가시성, 견고성, 유일성, 공모 허용, 비대칭성, 익명성, 조건부 추적성

공모 공격(collusion attack)
핑거프린팅은 삽입되는 내용이 구매자마다 모두 다르다. 따라서, 다수의 구매자들이 서로 공모하여 핑거프린팅이 삽입된 콘텐츠를 서로 비교하여 핑거프린팅 위치가 파악되는 핑거프린팅 비트를 지우거나, 전혀 상관없는 비트를 삽입해 콘텐츠를 재분배한다. 이렇게 공격자가 여러 개의 콘텐츠를 서로 비교하여 핑거프린팅 정보를 제거하거나 혹은 유추하여 다른 정보를 삽입할 수 있는 공격을 의미한다.

파밍이란?

파밍은 새로운 피싱 기법 중 하나이다. 파밍은 사용자가 자신의 웹 브라우저에서 정확한 웹 페이지 주소를 입력해도 가짜 웹 페이지에 접속하게 하여 개인정보를 훔치는 것을 말한다. 

 

스니핑이란?

스니핑이란 네트워크 상에서 자신이 아닌 다른 상대들의 패킷 교환을 엿듣는 것을 의미하며 간단히 말해 네트워크 트래핑을 도청하는 것을 말한다.

 

트로이목마란?

트로이 목마(Trojan horse)는 악성 루틴이 숨어 있는 프로그램으로, 겉보기에는 정상적인 프로그램으로 보이지만 실행하면 악성 코드를 실행한다. 이 이름은 트로이 목마 이야기에서 따온 것으로, 겉보기에는 평범한 목마 안에 사람이 숨어 있었다는 것에 비유한 것이다.

 

하이재킹이란?

세션 하이재킹은 시스템에 접근할 적법한 사용자 아이디와 패스워드를 모를 경우 공격 대상이 이미 시스템에 접속되어 세션이 연결되어 있는 상태를 가로채기 하는 공격으로 아이디와 패스워드를 몰라도 시스템에 접근하여 자원이나 데이터를 사용할 수 있는 공격이다.

 

DNS란?

DNS(Domain Name System)으로 도메인(naver.com)에 해당하는 IP 주소(125.209.222.142)를 알려주거나 반대로 IP 주소에 해당하는 도메인을 알려주는 시스템이다.

 

DNS 하이재킹이란

도메인에 해당하는 IP주소를 공격자가 원하는 주소로 변환하는 것이다. 즉, 이용자는 네이버에 들어가려고 하였지만, 막상 들어가보면 공격자가 원하는 다른 사이트가 나오는 것이다.

 

HTML5란?

Active5를 설치하지 않아도 동일한 기능을 구현할수 있고 특히 플래시나 실버라이트, 자라FX, Ajax를 깔지 않아도 인터넷 브라우저상에서 화려한 그래픽 효과를 구현하며 음악 동영상을 자유롭게 감상할수 있게 만들어 주는 진화된 웹언어이다.

 

HTML5의 특징

1. 그래픽을 사용자가 직접 그릴수 있는 캔버스 기능 추가

2. 비디오 코덱의 표준화

3. 로컬 스토리지 지원

4. Geolocation API 표준

5. WebWorker를 이용한 멀티 스레드 지원

 

프로그램이란?

“프로그램은 실행가능한 명령어(instruction)의 집합”이다. 프로그램은 보통 디스크에 저장되어 컴파일된 바이너리 이미지 형태일 수도 있고, 파이썬 스크립트 같이 해석되는(Interpret) 고급어 형태일 수도 있다.

 

프로세스란?

“프로세스는 메모리에 적재(load)되어 실행되고 있는 프로그램”을 말한다. 정적인 프로그램과 달리 프로세스는 실제 실행 중인 프로그램을 일컫기 때문에 동적이라고 표현하기도 한다.

 

 

 

 

지도학습에서 극도로 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해선 적절한 학습 데이터를 확보하는 방안이 필요하다. 대표적으로 오버 샘플링과 언더 샘플링 방법이 있다. 오버 샘플링 방식이 예측 방식이 예측 성능상 더 유리한 경우가 많아 주로 사용된다. 다음은 샘플링 방법을 설명한다.

 

출처: https://roytravel.tistory.com/55

언더 샘플링은 많은 데이터 셋을 적은 데이터 셋 수준으로 감소시키는 방식이다. 가령 정상 레이블을 가진 데이터가 10,000건, 비정상 레이블을 가진 데이터가 100건이 있을 경우 정상 레이블 데이터를 100건으로 줄이는 방식이다.

 

오버 샘플링은 비정상 데이터와 같이 적은 데이터 셋을 증식하여 학습을 위한 충분한 데이터를 확보하는 방법이다. 동일한 데이터를 단순히 증식하는 방법은 과적합이 되기 때문에 의미가 없으므로 원본 데이터의 피처 값들을 아주 약간만 변경하여 증식하며 대표적으로 SMOTE(Synthetic Minority Over-Sampling Technique) 방법이 있다.

 

SMOTE


SMOTE는 적은 데이터 셋에 있는 개별 데이터들의 K 최근접 아웃(K Nearest Neighbor)을 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터들을 생성하는 방식이다.

 

 

Reference : roytravel.tistory.com/55

현행 시스템 파악이란?

현행 시스템을 구성하는 하위 시스템을 파악하고, 연계정보, 제공기능, 기술요소 등을 파악하는 과정이다.

 

현행 시스템 파악 단계

현행 시스템 구성/기능/인터페이스 파악 -> 현행 시스템 아키텍쳐 및 소프트웨어 구성 파악 -> 하드웨어 및 네트워크 파악

(인터페이스 현황 파악: 데이터 형식,          (소프트웨어 파악: 라이선스 적용방식, 라이선수 

통신규약, 연계유형 등을 표시)                   수 파악)

 

소프트웨어 아키텍처란?

소프트웨어 아키텍처는 여러가지 소프트웨어 구성요소와 그의 특성 그리고 구성요소간의 관계를 표현한 시스템 구조를 말한다.

 

소프트웨어 아키텍처 프레임워크 구성요소

1. 아키텍처 명세서

2. 이해관계자

3. 관심사

4.관점

5. 뷰

6. 근거

 

소프트웨어 아키텍처 4+1 뷰

1. 유스케이스 뷰 (아키텍처를 도출하고 설계하는 작업을 주도)

2. 논리 뷰 (설계 모델의 추상화, 주요 설계 패키지와 서브 시스템, 클래스를 식별하는 뷰)

3. 프로세스 뷰 (런타임 시의 시스템의 테스크, 스레드, 프로세스와 이들사이의 상호작용)

4. 구현 뷰 (소프트웨어 모듈의 구성을 표현하는 뷰, 컴포넌트 뷰라고도 함)

5. 배포 뷰 (물리적 노드 구성과 상호 연결 관계를 배포 다이어그램으로 표현하는 뷰)

 

현행시스템 분석시 취득자료

1단계 - 정보시스템 구성도, 기능 구성도, 인터페이스 현황

2단계 - 현행 시스템 아키텍처 구성도, 소프트웨어 구성도

3단계 - 하드웨어, 네트워크 구성도

 

취득자료를 토대 분석대상

정보시스템 구성/기능 구성도: 정보시스템의 구분, 정보시스템 명......

(정보시스템이 들어가 있으면 맞다) 

인터페이스 현황: 송수신 시스템, 연계방식 및 연계주기, 연동 데이터 형식

(송수신 -> 인터페이스)

현행 시스템 아키텍처 구성도: 운영체제의 종류, 적용 프레임워크, 개층별 적용기술

(운영체제 -> 아키텍처 구성도)

소프트웨어 구성도: 단위 시스템별 필요 소프트웨어의 제품명 및 용도, 라이선스 적용방식, 수

(라이선스 -> 소프트웨어 구성도)

하드웨어 구성도: 하드웨어 관련 내용.....

네트워크 구성도: 네트워크 관련 내용....

 

운영체제란?

컴퓨터 시스템이 제공하는 모든 하드웨어와 소프트웨어를 사용하도록 해주고, 사용자와 컴퓨터 하드웨어 사이의 인터페이스 역할을 한다.

 

분석 시 고려사항

품질 - 신뢰도, 성능

지원 - 주변기기, 기술지원, 구축비용

 

네트워크란?

컴퓨터 장치들의 노드 간 연결을 통해 서로가 데이터를 교환할 수 있도록 하는 기술이다.

OSI7: APSTNDP ,전송(Segment) 네트워크(Packet), 데이터링크(Frame)

 

배치작업이란?

일련의 작업을 하나의 작업 단위로 묶어서 일괄적으로 처리하는 작업.

 

DBMS란?

데이터 집합을 만들고 저장 및 관리할 수 있는 기능들을 제공하는 응용 프로그램.

 

DBMS기능

중복 제어, 접근 통제, 인터페이스 제공, 관계 표현....

 

DBMS 분석 시 고려사항

성능 - 가용성, 성능, 상호 호환성

지원 - 기술 지원, 구축 비용

 

JDBC란?

자바에서 데이터베이스를 이용할수 있도록 연결해주는 응용 프로그램 인터페이스.

 

미들웨어란?

운영체제와 소프트웨어 애플리케이션 사이에 위치하고 있으며 분산 컴퓨팅 환경에서 응용 프로그램과 프로그램의 환경 간의 원만한 통신을 하도록 제어해주는 소프트웨어이다.

 

웹 애플리케이션(WAS)란?

서버계층에서 애플리케이션이 동작할 수 있는 환경을 제공하고 안정적인 트랜잭션 처리와 관리, 다른 이기종 시스템과의 애플리케이션 연동을 지원한다.

 

미들웨어 분석 시 고려사항

성능 - 가용성, 성능

지원 - 기술지원, 구축비용

 

기술 환경 정의를 위한 자료 수집

1. 온라인 트랜잭션(OLTP) 처리 시스템 (트랜잭션 수가 조사항목에 있으면 OLTP)

2. 웹/앱 애플리케이션 서버(WEB/WAS) (접속자수가 조사항목에 있으면)

 

요구사항의 분류

기능적 요구사항:

개념- 시스템이 제공하는 기능

특성- 기,완,일(기능성,완전성,일관성)

EX)최종 주문이 완료되면 배송추적 조회가 가능해야함

 

비기능적 요구사항:

개념- 시스템이 수행하는 기능

특성-신사효유이(신뢰성,사용성,효율성,유지보수성,이식성)

EX)특정 함수의 호출시간은 3초를 넘지 않아야 함

 

요구사항 개발 프로세스

1.요구사항 도출 - 어떻게 수집할지 파악

2.요구사항 분석 - 어떻게 상호작용하는지 이해

3.요구사항 명세 - 검토,평가,승인 가능한 문서를 작성하는 단계

4.요구사항 확인 - 완전한지 검증하는 단계

 

개발 프로세스 주요기법

도출 - 인터뷰,설문조사,브레인스토밍,워크숍

분석 - 자료흐름 지향 분석,객체지향 분석

명세

확인 - 동료검토,워크스루,인스펙션

 

요구사항 관리 절차(협기변확)

1.요구사항 협상

2.요구사향 기준선

3.요구사항 변경관리

4.요구사항 확인 및 검증

 

요구사항 분석 기법(분개할협정)

1.요구사항 분류

2.개념 모델링

3.요구사항 할당

4.요구사항 협상

5.정형 분석

 

요구사항의 확인 기법

1.요구사항 검토

2.프로토타이핑

3.모델 검증(개발된 모델의 품질 검증 필요)

4.인수 테스트(최종 제품을 기준으로 요구사항 만족시키는지 확인)

 

프로토타이핑란?

사용자가 요구한 주요 기능을 프로토타입으로 구현하여 사용자의 피드백을 통해 개선, 보완해나가는 기법이다.

 

요구사항 확인 프로세스

1.요구사항 목록 확인

2.요구사항 정의서 작성 여부 확인

3. 비기능적 요구사항의 확인

4. 타 시스템 연계 및 인터페이스 요구사항 확인

 

요구사항의 기술적 타당성 검토

1.성능 및 용량 산정의 적정성

2.시스템 간 상호 운용성

3.IT 시장 성숙도 및 트렌드 부합성

4.기술적 위험 분석

 

요구사항의 기술적 타당성 분석 프로세스

1.타당성 분석 결과 기록

2.타당성 분석 결과의 이해관계자 검증

3.타당성 분석 결과 확인 및 배포/공유

 

비용산정 모델 분류

하향식 산정방법 - 경험이 많은 전문가에게 의뢰

(전문가 판단, 델파이 기법)

상향식 산정방법 - 세부적인 요구사항과 기능에 따라 필요한 비용을 계산하는 방식

(LOC,ManMonth, COCOMO, 푸트남, 기능점수)

 

분석 모델 검증 방법

1. 유스케이스 모델 검증: 시스템 기능에 대한 유스케이스 모형 상세화 수준 및 적정성 검증을 위해 액터, 유스케이스, 유스케이스 명세서 점검

2. 개념수준의 분석 클래스 검증

3. 분석 클래스 검증

 

분석모델 검증 프로세스

1. 검토의견 컬럼 추가

2. 검토의견 작성

3. 검토의견 정제

 

분석 모델의 시스템화 타당성 분석 프로세스

1.타당성 검토의견 컬럼 추가

2.타당성 검토의견 작성

3.타당성 분석 결과 검증

4.타당성 분석 결과 확인 및 배포/공유

 

(1)소프트웨어 개발 보안 설계

SW 개발 보안의 개념: 소스 코드 등에 존재하는 보안 취약점을 제거하고 보안을 고려하여 기능을 설계 및 구현하는 것

 

SW 개발 보안의 구성요소

C(confidentiality): 기밀성

I(Availability): 가용성

A(Integrity): 무결성

 

SW 개발 보안 용어

1. 자산: 조직의 데이터 또는 조직의 소유자가 가치를 부여한 대상

2. 위협: 조직이나 기업의 자산에 악영향을 끼칠 수 있는 시건이나 행위

3. 취약점: 위협이 발생하기 위한 사전 조건에 따른 상황

4. 위험: 위협이 취약점을 이용하여 조직의 자산 손실 피해를 가져올 가능성

 

Dos 공격: 시스템을 악의적으로 공격 해당 시스템의 자원을 부족하게 하여 원래 의도된 용도로 사용하지 못하게 하는 공격. 

 

DoS공격의 종류

1. 지역 시스템 공격

2. 원격 네트워크 공격

 

DDos 공격: DoS의 또 다른 형태로 여러대의 공격자를 분산 배치하여 동시에 동작하게함으로써 특정 사이트를 공격하는 기법.

 

DDos의 공격 구성요소

1. 핸들러

2. 에이전트

3. 마스터

4. 공격자

5. 데몬프로그램

 

DDos 공격 대응방안

1. 차단 정책 업데이트

2. 좀비 PC IP 확보

3. 보안 솔루션 운영

4. 홈페이지 보안 관리

5. 시스템 패치

 

자원고갈 공격 기법

1. SYN 플러딩: 서버의 동시 가용 사용자 수를 SYN 패킷만 보내 점유하여 다른 사용자가 서버를 사용 불가능하게 하는 공격

2. UDP 플러딩: 응답 메시지(ICMP)를 생성하게 하여 지속해서 자원을 고갈시키는 공격

3. 스머프

4. PoD(Ping of Death)

 

애플리케이션 공격기법

1. HTTP GET 플러딩

2. Slowloris 

3. RUDY

 

네트워크 서비스 공격

1. 네트워크 스캐너, 스니퍼

2. 패스워드 크래킹

3. IP 스푸핑

4. 트로이 목마

 

초 간 단 정 리 

(기본은 미리 학습하고 보시면 좋습니다.)

 

(1)프로시저란?

프로시저는 절자형 SQL을 활용하여 특정기능을 수행할 수 있는 트랜잭션 언어이다. 

 

프로시저의 구성 (빈칸 단답식)

1. 선언부 : 프로시저 명칭, 변수와 인수 타입 정의

2. 시작부/종료부 : 시작 종료 표현 다수 실행을 제어하는 기본 단위

3. 제어부 : 순차처리 조건문과 반복문을 이용

4. SQL : DML 주로 사용 

5. 예외부 : 예외처리

6. 실행부 : DBMS 적용 또는 취소 여부 결정 처리

 

선언부

Create[ or replace] Procedure

파라미터명 [mode] 데이터 타입 - mode(IN, OUT, INOUT) ,데이터타입(CHAR, NUMBER, VARCHAR)

.....

IS

변수 선언

 

제어부 

IF ~THEN

  sentence~
ELSIF ~ THEN

  sentence~

ELSE

  sentence~

END IF

 

Case

When ~ THEN

  SET~

When ~ THEN

  SET~

ELSE

  SET~

 

프로시저 SQL

Select, Insert, Update, Delete

 

프로시저 실행부

Commit, Rollback

 

(2)사용자 정의함수

특정 절차형 SQL을 활용하여 SQL을 처리하고 수행결과를 단일값으로 반환하는 SQL.

 

사용자 정의함수 구현

1. 선언부

2. 시작부/종료부

3. 제어부

4. SQL

5. 예외부

6. 반환부 ***

 

선언부 (반환이 있다는 점과 Function의 차이를 제외하고는 유사하다)

Create [OR replace] Function 함수명

Return 데이터_타입

파라미터 명 [Mode] 데이터_차입

...

IS

변수 선언 

 

(3)트리거

특정 테이블에 삽입 수정 삭제 등의 데이터 변경 이벤트가 발생하면 DBMS에서 자동적으로 실행되도록 구현된 프로그램이다.

 

트리거의 목적

특정 테이블에 대한 데이터 변경을 시작점으로 설정 그와 관련한 모든 작업을 자동으로 수행하기 위해 트리거 사용

 

트리거 종류

1. 행 트리거

2. 문장 트리거 

 

트리거의 구성

반환값이 없다는 점 DML을 주된 목적으로 한다는 점에서 프로시저와 유사하지만

EVENT 명령어를 통해 트리거 실행을 위한 이벤트를 인지한다는 점 외부 변수 IN/OUT이 없다는 점은 프로시저와 사용자 정의 함수와 다르다.

1. 선언부

2. 이벤트부

3. 시작/종료부

4. 제어부

5. SQL부

6. 예외부

 

선언부

Create [Or replace] Trigger 트리거 명

 

이벤트부

순서 유형 On 테이블명

[FOR EACH ROW]

 

이벤트 순서 

BEFORE

AFTER

 

이벤트 유형

INSERT

UPDATE

DELETE

 

트리거 작성 시 주의사항

TCL 사용 불가 - 트리거 내에는 Commit, Rollback 등의 TCL 사용시 컴파일 에러 발생

오류의 주의 - 트리거 실행 중 오류가 발생하게 되면 트리거 실행의 운인을 제공한 데이터 작업에도 영향

 

(4)데이터 분석 함수의 개념

데이터 분석을 위해 복수 행 기준의 데이터를 모아서 처리하는 것을 목적으로 하는 다중 행 함수이다.

 

데이터 분석 함수 종류

1. 집계 함수

2. 그룹 함수

3. 윈도 함수

 

집계 함수

여러행 또는 테이블 전체 행으로 부터 하나의 결과값을 반환하는 함수이다.

 

집계 함수의 종류

Count, sum, Avg, Max, Stddev, Varian

 

그룹 함수

테이블의 전체 행을 하나 이상의 컬럼을 기준으로 컬럼 값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수

 

그룹함수 유형(결과를 보고 고르는 문제)

1. Rollup

2. Cube

3. Grouping Sets

 

윈도 함수

윈도 함수는 데이터베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해서 표준 SQL에 추가된 함수

 

윈도 함수의 구문

Select function_name(para~)

 Over

([Partition by columns1, col2,...])

[Order by col1, col2....]

 From table_name

 

윈도 함수의 분류

1. 순위 함수 (rank, Dense_rank, row_number)

2. 행순서 함수 (first_value, Last_value, LAG, LEAD)

3. 그룹 내 비율 함수 (Ratio_To_Report, Percent_rank)

 

(5)응용 시스템 DBMS 접속 기술

 

자바 데이터베이스 연결(JDBC: Java DataBase Connectivity)

JDBC는 SQL을 사용하여 DBMS에 질의하고 데이터를 조작하는 API를 제공한다.

 

MyBatis

MyBatis는 DBMS에 질의하기 위한 SQL 쿼리를 별도의 XML파일로 분리하고 Mapping을 통해 SQL을 실행한다.

 

DCL(데이터 제어어) 

데이터베이스 관리자가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 관리자가 사용하는 제어용 언어

 

데이터 제어어의 유형

1. Grant (grant 권환 on 테이블 to 사용자 [with 권한 옵션])

2. Revoke (revoke 권한 on 테이블 from 사용자 [cascade constraints])

 

참고 서적: 수제비 2020 정보처리기사 실기 vol.2

 

 

 

 

SQLD 시험을 본지 시간이 좀 지났지만 늦게나마 많은 사람들에게 도움이 되고자 공부법 및 시험 후기를 알려드리고자 합니다. 먼저 저는 전공자이지만 데이터베이스를 공부한지 오래되어.... Anyway~  저는 37화 시험을 봤고 운좋게도 80점으로 합격을 할수 있었습니다.

이글을 통해 시험을 준비하는 모든사람들이 노랭이에 대해서와 시험공부자료를 얻어갈수 있으면 좋겠습니다.

저는 참고서를 이용하지 않고 데이터진흥원에서 제공하는 자료를 다운받아 공부했습니다.

(생각보다 양이 좀 많았지만 자세하게 공부할 수 있어서 저에게는 큰 도움을 받았습니다 하지만 비전공자의 경우 참고서를 이용하는 방법도 좋은거 같아요!!!

 

다음으로 문제집입니다. 일명 노@랭@이@책을 5회독 정도했습니다.

저는 기억력이 나빠서 빠르게 여러번을 보는 타입이라.. 횟수는 중요치 않습니다~

각자 공부 방법에 맞춰 진행하시면 될거 같아요!!!  꼭 기 억 하 셔 야 됩 니 다 노 랭 이!!!!(홍보아니에요...ㅠㅠ;;)

출처 : 교보문고

솔직하게 말씀드리면 개념을 빠르게 훑으시고 위의 노랭이 문제를 편하게 풀수 있을정도로 실력을 갖춘다면 시험에서 무리없이 좋은 성적을 얻을거라 확신하고 확신합니다. ^^

 

후기를 쓰는 것이 처음이라 뭘 써야할지 몰라서 뒤죽박죽이지만 이 글을 보고 나갈때는 노랭이 책을 통해 공부하자는 것만 기억한다면 ㅎㅎ 성공입니다 >_0. 

 

제가 공부했던 개념과 문제 자료는 아래에 올려드렸으니 함께 병행하시면 더 좋은 성적을 얻을 수 있을겁니다.

다들 1회 1성공 하세요! 화이팅!!

 

1-1.데이터 모델링의 이해.pdf
2.42MB
1-2.데이터 모델의 성능.pdf
2.83MB
2-1.SQL 기본.pdf
2.63MB
2-2.SQL 활용.pdf
1.82MB
2-3.SQL 최적화 기본 원리.pdf
0.53MB
SQLD 기출문제 모음(21, 24, 25, 26, 30).pdf
1.15MB
SQLD_요약 서브노트.pdf
8.52MB

programmers.co.kr/learn/courses/30/lessons/64064#

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 무지는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 ��

programmers.co.kr

문제 설명


개발팀 내에서 이벤트 개발을 담당하고 있는 무지는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 사용자라는 이름으로 목록을 만들어서 당첨 처리 시 제외하도록 이벤트 당첨자 담당자인 프로도 에게 전달하려고 합니다. 이 때 개인정보 보호을 위해 사용자 아이디 중 일부 문자를 '*' 문자로 가려서 전달했습니다. 가리고자 하는 문자 하나에 '*' 문자 하나를 사용하였고 아이디 당 최소 하나 이상의 '*' 문자를 사용하였습니다. 무지와 프로도는 불량 사용자 목록에 매핑된 응모자 아이디를 제재 아이디 라고 부르기로 하였습니다. 예를 들어, 이벤트에 응모한 전체 사용자 아이디 목록이 다음과 같다면

 

접근 방법


먼저 banned_id 리스트로 만들수 있는 모든 경우의 수를 구합니다. 그 과정에서 만들어진 목록을 string으로 하나로 만들도록 했습니다. 

그리고 이렇게 만들어진 string 백터에서 중복을 제거하면  끝~ level 3번 치고 쉬운 문제였네요 ^0^~

 

코드 


#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

vector<int>astro;
vector<string>ans;
vector<string>container;
bool isused[10];
int cnt=0;
bool compare(string a,string b){
    if(a.length()>b.length()) return false;
    else if(a.length()<b.length()) return true;
    else return a<b;
}
void gd(vector<string> user_id,vector<string> banned_id){
    if(cnt==banned_id.size()){
        vector<string>a;
        a=container;
        sort(a.begin(),a.end(),compare);
        string temp="";
        for(int i=0;i<a.size();i++){
            temp+=a[i];
            temp+=" ";
        }
        ans.push_back(temp);
        return;
    }
    for(int i=0;i<user_id.size();i++){
        //이미 사용된 아이디 제외
        if(isused[i]==true)continue;
        string s1= user_id[i];
        int correct_cnt=0;
        //길이 확인
        if(s1.size()==banned_id[cnt].size()){
            for(int j=0;j<s1.size();j++){
                //각각의 요소 비교
                if(banned_id[cnt][j]=='*'||s1[j]==banned_id[cnt][j]){
                    correct_cnt++;
                    continue;
                }
                else break;
            }
            //같을 경우
            if(correct_cnt==s1.size()){
                container.push_back(s1);
                isused[i]=true;
                cnt++;
                gd(user_id,banned_id);
                isused[i]=false;
                cnt--;
                container.pop_back();
            }
        }
        
    }
}
int solution(vector<string> user_id, vector<string> banned_id) {
    int answer = 0;
    memset(isused,false,sizeof(isused));
    gd(user_id,banned_id);

    sort(ans.begin(),ans.end());
    ans.erase(unique(ans.begin(),ans.end()),ans.end());

    return ans.size();
}

funny algorithm 0_<

programmers.co.kr/learn/courses/30/lessons/17676?language=cpp

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ 2016-09-15 20:59:57.421 0.351s, 2016-09-15 20:59:58.233 1.181s, 2016-09-15 20:59:58.299 0.8s, 2016-09-15 20:59:58.688 1.041s, 2016-09-15 20:59:59.591 1.412s, 2016-09-15 21:00:00.464 1.466s, 2016-09-15 21:00:00.741 1.581s, 2016-09-15 21:00:00.748

programmers.co.kr

문제 설명


이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다. 

 

입력 형식

1. solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며,

각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.

2. 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.

3. 처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.

(예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 2016년 9월 15일 오전 3시 10분 **33.010초**부터 2016년 9월 15일 오전 3시 10분 **33.020초**까지 **0.011초** 동안 처리된 요청을 의미한다.) (처리시간은 시작시간과 끝시간을 포함)

4. 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.

5. lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

 

출력형식

- solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.

 

접근 방법


먼저 시간을 분류하고 초 단위 통일했습니다. 처음 방법은 초기 시간 중 가장 작은 시간부터 시작해서 초기 시간 중 가장 긴 시간까지 탐색을 하는 방법으로 진행했습니다!! (시간 초과가 날걸 알았지만 ㅠㅠ 방법이 생각이 안 나서....)

이후에는 시간을 서치 하면서 오차범위로 탐색하는 방법을 선택하여 성공하게 되었습니다.

 

ps) c++ 부동소수점 비교 ***

c++로 구현하면서 double로 저장된 값들을 비교할때 a≥b 같이 사용하면 같은 값이라도 거짓으로 나오는 경우가 있다.

부동소수점 표현에서 발생되는 오차때문에 직접적으로 비교하는건 정확하지 않다.

그래서 위의 코드에서도 epsilon이라는 작은 허용 오차 범위를 정해서

a≥b → abs(a-b)≥epsilon 의 형태로 바꿔서 비교해야한다.

 

코드 


[바른 코드]

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

#define abs(x) x<0 ? -x : x
#define epsilon 0.001

using namespace std;


vector<pair<double,double>>range;
vector<int>ans;
int solution(vector<string> lines) {
    int answer = 0;
    for(int i=0;i<lines.size();i++){
        string data=lines[i];
        double hour=stod(data.substr(11,2))*3600;
        double minute=stod(data.substr(14,2))*60;
        double sec=stod(data.substr(17,6));
        double Time=stod(data.substr(24,data.size()-24-1));
      
        double second_time = hour+minute+sec;
        double first_time =second_time-Time; //0.001 더해줄것
        if(first_time<0)first_time=0.000;
        else first_time=first_time+0.001;
        range.push_back(make_pair(first_time,second_time));
    }
    double minimum=9876543.0,maximum=0.0;
    for(int i=0;i<range.size();i++){
        minimum=min(range[i].first,minimum);
        maximum=max(range[i].first,maximum);
    }
    int cnt;
    double start=minimum;
    
    for(int i=0;i<range.size();i++){
    	double begin = range[i].second;
    	double end = begin+0.999;
    	cnt=0;
    	for(int j=i;j<range.size();j++){
    		if(abs(range[j].second-begin)>=epsilon && abs(range[j].first-end)<=epsilon) cnt++;
    		
    	}
    	//최대값 저장
    	answer=max(answer,cnt);
    }
    return answer;
}

[오류 코드]

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

vector<pair<double,double>>range;
vector<int>ans;
int solution(vector<string> lines) {
    int answer = 0;
    for(int i=0;i<lines.size();i++){
        string data=lines[i];
        double hour=stod(data.substr(11,2))*3600;
        double minute=stod(data.substr(14,2))*60;
        double sec=stod(data.substr(17,6));
        double Time=stod(data.substr(24,data.size()-24-1));
      
        double second_time = hour+minute+sec;
        double first_time =second_time-Time; //0.001 더해줄것
        if(first_time<0)first_time=0.000;
        else first_time=first_time+0.001;
        range.push_back(make_pair(first_time,second_time));
    }
    double minimum=9876543.0,maximum=0.0;
    for(int i=0;i<range.size();i++){
        minimum=min(range[i].first,minimum);
        maximum=max(range[i].first,maximum);
    }
    int cnt;
    double start=minimum;
    
    while(true){
        cnt=0;
        for(int i=0;i<range.size();i++){
            if(start > range[i].second || start+1 < range[i].first )continue;
            else cnt++;
        }
        
        answer=max(answer,cnt);
        if(start+0.999>=maximum)break;
        else start=start+0.001;
        //printf("%lf \n",start);
        
    }
    return answer;
}

funny algorithm 0_<

+ Recent posts