푸는데 꼬박 2일걸렸다.. 물론 일이 바빠서 제대로 푼건 몇시간 안되지만

역시 시작을 잘못 시작하게 되면 계속 꼬이게 되는 걸 경험했다.

처음엔 3으로 빼면서 5로 나눈 카운트를 구하고 5로 빼면서 3으로 나눈 카운트를 각각 구했는데

잘 안풀렸다.

결국엔 처음부터 다시 입력 조건 별로 확인해보니 무조건 3씩 빼면서 5로 나눴을때 나머지가 없으면 최소가 된다는 것을 확인하고 금방 풀렸다.

 

문제 풀기 전! 밑그림이 가장 중요하다.

 

8번만에 성공 ㅋㅋㅋ

 

내 풀이 :

 

 

 

규칙성을 찾아봐도 규칙이 안보이므로 2차원 리스트로 해결!

처음에 1차원 리스트로하다가 잘 안되서 2차원 리스트로 풀었는데

다른 풀이들을 보니 1차원으로 충분히 해결가능,...

내일은 1차원으로 다시 풀어봐야지.

 

내 풀이:

 

 

 

ACM호텔. 수학 문제

규칙을 찾는 문제였다.

주어진 예제입력과 직접 테스트케이스를 정해서 규칙을 찾아보았다.

If문을 통해 2가지 경우를 나눠서 출력하도록 했다.

 

1. N( 몇번째 손님) / H(높이) 의 나머지가 0 일 경우 

 이 경우에는 나머지가 0으로 나오므로 가장 위의 방번호가 주어진다.

6번째 손님에 높이가 6이면 601호

12번째 손님에 높이가 6이면 602호

18번째 손님에 높이가 6이면 603호

.

.

 이와 같이 H가 N의 배수이면 앞의 층수는 H이고 뒤의 호수는 N의 배수만큼 늘어난다

그러므로 코딩은 다음과 같이 

나머지가 0이면 h*100을 곱한수에 몫을 더해주면 된다.

 

2. N( 몇번째 손님) / H(높이) 의 나머지가 0가 아닐 경우

이 경우에는 각 테스트케이스로 규칙을 찾아보니

10번째 손님에 높이가 6이면 101~ 601 까지 돌아가고 다시 102, 202, 302, 402 로 10번째손님이 402호에 배정.

72번째 손님에 높이가 30이면 101~ 3001 까지 돌아가고 다시 102~ 3002 까지가면 60명. 남은 12명은 101 ~ 1203해서 72번째 손님은 1203방에 배정된다.

 

이와같이 규칙은 

N / H 의 나머지에 *100을 곱하고 N/H의 몫에 1을 더하면 방이 계산된다.

=> 높이만큼 반복하고 남은 나머지는 1호~1+나머지호수 까지 방이 주어지게 되므로.

 

그래서 그리 어렵지 않게 풀 수 있었다!

 

 

내 풀이

달팽이는 올라가고 싶다

간단한 수학문제다.

A-B 만큼 올라가다가 마지막에는 A만큼 한번더 올라가면  V 막대에 다 올라갈수 있다.

그러므로 풀이방법은 (V-A)에 (A-B)의 몫을 구하고 +1를 해주면 된다.

라고 생각했는데 틀렸다....

80 25 6666으로 했을때

 

6666-80 / 80 - 25 = 119.74545 가 나온다.

55*120 = 6600

55*119 = 6545 가 나오므로 120이 구해지고 +1을 해줘야 했다.

 

그래서 몫을 반올림하고 +1을 더해주는 방법으로 하니 풀렸다.

 

내 풀이

 

 

 

숏 코딩

 

 

 

분수찾기 문제.

규칙을 찾는 것이 어려웠다.

처음에 시간복잡도 생각없이 WHILE 반복으로 처리하다가 시간복잡도를 생각하고 처음부터 다시 풀었다.

문제 풀이 방법은 X가 주어졌을 때 X가 어떤 배열에서 시작되는지를 구해서 시작과 X의 차이만큼 분모, 분자를 계산해서 구했다.

 

예)  X = 14

 

1의 시작은 1/1

2의 시작은 1/2 

3의 시작은 3/1

4의 시작은 1/4 

와 같이 짝수면 가로로 홀수면 세로 끝에서 시작하여

 

 

 

 

세로에서 시작시 분자 - 1, 분모 +1

가로에서 시작시 분자 + 1 , 분모 - 1 로 진행한다.

세로 3/1 에서 시작시 3/1-> 2/2 -> 1/3

가로 1/4 에서 시작시 1/4-> 2/3 -> 3/2 -> 4/1 순.

 

시간 복잡도를 생각하여 입력된 X만큼 반복하는 것이 아니라

X보다 큰 최대 카운트를 찾았다.

즉 14가 입력되었을때 14의 가장마지막 끝인 15를 구했고 15까지 오는 카운트는 5라는 것을 구했다.

규칙은

1 -> 1

2 -> 2,3

3 -> 4,5,6

4 -> 7,8,9,10

.

.

 

이제 14의 시작점을 알았으니 시작점과 14의 분자, 분모 차이만 빼주고 출력하면 끝!

 

 

내 풀이

 

벌집문제.

규칙을 찾아서 문제를 풀려고 노력했다.

처음에는 1을 포함하고 For 반복문으로 규칙을 찾다보니 잘 안풀렸는데

1일 때는 무조건 1을 출력하고 

2부터 규칙을 찾아보니

2 ~ 7 / 2

8 ~ 19 / 3

20 ~ 37 / 4

38 ~ 61 / 5 

 

이렇게 한칸씩 늘어나면서 6의배수 * 단계-1 만큼 늘어나는 것을 찾았다.

즉 각 단계의 마지막 숫자가

2일 때는 1 + 6  = 7 

3일 때는 1 + 6 + 12  = 19

4일 때는 1 + 6 + 12 + 18  = 37

5일 때는 1 + 6 + 12 + 18 + 24 = 61 

이 된다.

 

 

내 풀이 

 

 

다른 풀이

백준 숏코딩을 보니 신기하게?? 풀었는데 아직 이해가 가지 않는다.

나머지 풀이들은 대부분 비슷한 방식이었다.

백준 문제시작 !

 

문제 풀이는 간단하다.

수학 방정식으로 풀면된다.

대신 나는 생각없이 길게~~~~ 풀어서 제출했는데

다른 사람들이 푼 결과들을보니 1줄로도 가능한 문제였다.

1줄은 조금 가독성이 떨어지는 것 같고 2줄이 적당한 문제인 것 같다.

앞으로 가독성은 높이면서 줄일 수 있는건 줄이도록 !

 

내 풀이 

 

다른 풀이 예

 

1. 숫자형 자료형

 

(1) 정수형

말그대로 정수형 integer. Int를 말한다. 1,2,3 / 0 / -1,-2,-3 양/0/음의 정수.

 

 

(2) 실수형

정수에 소수점이 포함된 숫자. 실수를 말한다. 1.2, 0.555 , -3.5

컴퓨터식 지수표현방식 : 4.24e10 으로 표현

4.24E10은 4.2410104.24∗1010,

4.24e-10은 4.2410104.24∗10−10을 의미

 

(3) 8진수 , 16진수

8진수는 숫자0 이나 알파벳 o로 시작.

16진수는 0x로 시작.

 

 

(4)사칙연산

다른언어와 마찬가지로 + - * / 가 가능.

 

(5) ** 제곱

** 연산자는 제곱을 구할 수 있다.

 

(6) % 나머지 

%는 나눗셈의 나머지 값을 반환한다. (MSSQL 에도 % 나머지를 구해주는 연산자가 있다!)

 

(7) // 몫 

 

// 몫은 나눗셈의 몫을 구해준다.

 

 

 

 

-- 자료형의 크기는 ????

(1) 구글에 냅다 검색합니다. SQL SERVER 2019 설치

 

(2) SQL SERVER 2019 개발자버전 다운로드

 

(3) 실행 후 냅다 기본으로!

 


(4) 설치중..

 

(5) 완료 후 SSMS도 설치하고, 실행해봅시다

 

 

 

기타 다른 설정이나 테스트는 다음에!

 

'AWS' 카테고리의 다른 글

[AWS] EC2 보안그룹 추가 및 연결  (0) 2021.02.08
[AWS] AWS EC2 프리티어 시작  (0) 2021.02.03

13번에서 DMV를 소개했지만 다시 한번 공부해보고자 정리!

 

DMV를 활용해서 직접 확인하는 경우도 있지만

보통은 스크립트로 저장해서 필요할때마다 확인하는 경우가 많은 것 같다.(나의 경우..)

DMV 개수도 많고 외워두면 편하긴 하지만 필요할때마다 일일히 짜기도 귀찮기도해서

몇가지 자주쓰는 스크립트로 DMV를 활용할 수 있도록 만들어 두는 것이 좋을 것 같다.

(사실 노트북에 있는데 귀찮아서 찾아보고 공부!!)

출처는 구글링을 통해 여기저기서 가져오고 필요한것과 필요없는것을 수정하는 방식으로...

 

(1) CPU 소모량이 많은 Stored Procedure 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT db_name(C.dbid) AS DBName 
       ,object_schema_name(C.objectid,dbid) AS SchemaName 
       ,object_name(C.objectid,dbid) AS StoredProcedure 
       ,sum(B.execution_count) AS Execution_count 
       ,sum(B.total_worker_time) AS total_cpu_time 
       ,sum(B.total_worker_time) / (sum(B.execution_count) * 1.0) AS avg_cpu_time 
FROM sys.dm_exec_cached_plans AS A
JOIN sys.dm_exec_query_stats  AS B on A.plan_handle=B.plan_handle
CROSS APPLY sys.dm_exec_sql_text(A.plan_handle)  AS C
WHERE db_name(C.dbid) is not null and A.objtype='proc'
GROUP BY db_name(C.dbid), object_schema_name(objectid,C.dbid), object_name(objectid,C.dbid)
ORDER BY sum(B.total_worker_time) DESC
 
cs

 

 

(2) 비용이 드는 쿼리 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT TOP 20   
       SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,  
       (( CASE qs.statement_end_offset  
          WHEN -1 THEN DATALENGTH(qt.TEXT)  
          ELSE qs.statement_end_offset 
          END - qs.statement_start_offset)/2)+1) AS 수행쿼리,  
        qs.execution_count              AS 쿼리계획이_마지막컴파일후_실행횟수,  
        qs.total_logical_reads          AS 쿼리계획이_컴파일후_실행될때_수행한_총논리적읽기수,  
        qs.last_logical_reads           AS 마지막_수행한_논리적읽기수,  
        qs.total_logical_writes         AS 쿼리계획이_컴파일후_실행될때_수행한_총논리적쓰기수,   
        qs.last_logical_writes          AS 마지막_수행한_논리적쓰기수,  
        qs.total_worker_time            AS [쿼리계획이_컴파일후_실행될때_사용된_총CPU시간(마이크로초)],   
        qs.last_worker_time             AS [마지막_실행될때_사용된_CPU시간(마이크로초)],  
        qs.total_elapsed_time/1000000     AS [실행완료하는데 소요된 총 경과시간(마이크로초)_초로변환],  
        qs.last_elapsed_time/1000000     AS [최근 실행완료하는데 소요된 경과시간(마이크로초)_초로변환],  
        qs.last_execution_time AS 해당쿼리가_마지막으로_실행된_시간 
  FROM       sys.dm_exec_query_stats AS qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt  
  CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp  
  ORDER BY    qs.last_worker_time DESC    
 
cs

 

 

(3) 쿼리계획에 대한 요약 성능 확인

읽기, 쓰기, 총 행, 완료 시간, 계획 해시, 메모리 부여 정보, 스레드, 열 저장소 통계, 유출 및 병렬 처리 정도와 같은 단일 계획에 연결된 통계

 

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT TOP 5 
      query_stats.query_hash AS "Query Hash",  
      SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",  
      MIN(query_stats.statement_text) AS "Statement Text"   
FROM (SELECT QS.*,   
            SUBSTRING(ST.text, (QS.statement_start_offset/2+ 1,  
            ((CASE statement_end_offset
              WHEN -1 THEN DATALENGTH(ST.text)  
              ELSE QS.statement_end_offset END  - QS.statement_start_offset)/2+ 1) AS statement_text  
FROM sys.dm_exec_query_stats AS QS   
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats 
GROUP BY query_stats.query_hash   
ORDER BY 2 DESC;  
cs

 

더 만들어보기.....~!!

'SQL Server 운영' 카테고리의 다른 글

[MSSQL] 22. 복구모델의 이해  (0) 2021.05.12
[MSSQL] 20. RAID 구성  (0) 2021.02.09
[MSSQL] 19. JOIN의 종류와 특징  (0) 2021.02.05
[MSSQL] 18. Index 정리  (0) 2021.02.04
[MSSQL] 17. 백업종류 및 백업 스크립트  (0) 2021.02.01

+ Recent posts