id가 admin이면 이 문제를 해결할 수 있다.

여기서 md5는 암호화 온라인 도구로 입력 문자열을 고정된 128비트 md5문자열로 암호화 하는데 사용된다.

앞에 gremlin문제를 풀었던 방식과 동일하게 풀려고 했더니 정답이 아니였다..

 

여기서는 pw가 뭐든 상관 없이 id가 admin이면 정답이여서 뒤에는 주석처리하면 풀리는 문제다.

뒤에 md5이런거 신경 안쓰고 id에 admin을 너헝주고 뒤를 주석처리 하니까 문제가 풀렸다..!!

 

DB정보를 SQL쿼리문을 이용하여 id와 pw가 일치하는지 확인하는 코드이다.

$_GET[id] $_GET[pw] get을 통해 값을 얻어 주소창에 값을 전달 할 수 있다.

 

id에는 아무 값이나 넣고 pw를 1=1 0=0 등 참이 되도록 하는 방법 등이 있다

 

정답

?id=a' or '1=1'%23

?id=admin' or '1=1'%23

 

작은 따옴표가 왜 저렇게 붙는지는 아직 모르겠다..

 

'+ , -' 교행 분수 수열

자바로 구현

while(true)로 무한루트

 

 

 

분모의 팩토리얼 구하는.

 

B%2==1이면 덧셈, 아니면 뺄셈

 

B>10이면 break

 

 

 


count 알고리즘

 

시험 성적 80점 이상인 학생의 수 count 구하는 알고리즘

배열 변수 JUMSU(100)에 대해 생각 배열 변수은 첫번째 1부터 100까지 순서를 메기면 J[0] ~ J[99]

80점 이상인 학생수를 변수 CNT에 저장

 

여기서 I는 처리할 학생을 말함. 

 

-> 반복용 변수의 진행방식 바꾸려면? 초기값 100 / i = i - 1 식으로


최댓값과 최솟값

영어시험 만점 학생들 중 가장 높은 수학 시험 점수를 가지고 있는 학생의 수학 점수를 찾아서 출력하는 알고리즘

- 시험 본 학생 200명

- 영어줌수는 배열 변수 ENG(200) 수학점수는 배열변수 MATH(200)에 저장

- 영어 , 수학 모두 100점 만점 , 영어 점수가 만점인 학생이 최소한 1명 존재한다고 가정

 

1) 영어 점수가 만점인지

2) 수학 점수가 최고점인지

 

둘다 만족해야 된다.


합계와 평균

휴대폰 고객 1명이 한달 도안 사용하는 총 통화시간을 토대로 일일 평균 통화시간을 구하는 알고리즘

- 한달 30일 , 매일(i)의 통하시간을 변수 T(i)에 저장

- 만일 일일 통화 시간이 200초 이하이면 무료서비스, 총 통화시간에서 제외하고 평균 통화시간을 산정하는 과정에서 제외

 

 

 

 

 

i = 1 부터 증가

 

 

 

200보다 작으면 무료

 

 

 

i는 앞으로 처리할 것

 

 

 

 

 


소수판별 알고리즘

1부터 100사이에서 가장 큰 소수 구하는 알고리즘

자연수 N이 소수라면 2부터 N의 제곱근 루트N까지의 자연수들 중에서 N을 나누어 떨어지게 하는 수는 존재하지 않음.

N의 제곱근은 시스템 함수 SQRT(N)을 호출하여 계산

 

 

초깃값은 소수 2

 

 

2부터 루트 N 검사

 

 

 

 

 

 

 

 

다음에 점검할 N 

 

 

 

 


소인수 분해

자연수 N을 입력받아 소인수 분해하여 결과를 출력하는 과정을 반복하는 알고리즘

소수입력하면 소수출력 , 20입력하면  2*2*5출력

-입력받은 값 N은 1000이하의 자연수로 가정

- 입력받은 정수 N이 2보다 작으면 알고리즘 종료

- 입력받은 정수 N이 소수면 소수라고 출력

- 입력받은 N이 소수가 아니면 소인수 분해 한 결가를 출력

- 단계별로 소운수 분해한 결과를 배열에 저장해 두었다가 한꺼번에 출력

 

 

 

 

 

 

 

P는 N을 P로 나눈 나머지 0이 아니면 반복.

 

 

 

 

 

 

 

여기서부터 출력하는 부분

T가 1이면 소수 T가 일이 아니면 반복

T = T - 1하면서 반복

T가 소수가 몇개인지 나타냄.


배수와 공배수

배열 A에 21 17 ,4 51 24 75 40 27 48 72가 A(!)부터 시작하여 순차적을 ㅗ입력

2의 배수이면서 4의 배수인 수의 개수를 구하는 알고리즘


약수와 완전수

4부터 500까지의 자연수 중에서 완전수를 찾아 출력하고 개수를 구하는 알고리즘

 

 

완전수 개수 처음에는 0

 

 

자연수 n의 절반의 값을 계산

 

 

j가 자연수 n의 약수인 경우 sum에 더한다.

 

 

 

완전수인지 확인하는 방법 n =sum

 

완전수일때 tn증가

 

출력 tn 완전수의 개수

 

 

 


1의 보수와 2의 보수 알고리즘

N의 보수 / N-1의 보수

이진수 1010100

1의 보수 0101011

2의 보수 0101100

 

1부터 n까지 반복하며 1의 보수 구함

 

 

오른쪽

n부터 시작해서 감소함

2의 보수는 T(i)와 c의 값이 같을때 0이고 다르면 1

 

 

 

 

새로운 캐리 c는 이전 캐리와 O(i) 모두 1일때만 1이 된다.

 

 

 

 

 


최대공약수와 근사값

최대공약수 GCD

최소공배수 LCM

 

유클리드 호제법에 의해 정수 X,Y의 최대공약수 구하는 알고리즘

 

+ 최대 공약수로 최소 공배수 구하는 방법

X와 Y의 초소공배수는 X와 Y의 곱을 X와 Y의 최대공약수로 나누면 된다.

G를 X와 Y의 최대공약수라고 하면 X = aG, Y =bG

따라서 X*Y = aG * bG = abGG로 최소공배수 = abG = X*Y/G가 된다.


근사값

배열 A(100)의 원소 100개는 절대값이 500이하이다. 이중 정수 33에 가장 가까운 근사값을 찾아 해당 원소의 첨자를 출력하는 알고리즘

- 33보다 작으면 차이는 33-배울원소의 값

- 33보다 크면 차이는 배열 원소의 값 -33

 

피보나치수열

1, 1, 2, 3, 5, 13...  An = An-1 + An-2 (n>=3)

 

피보나치수열 순서도로 나타내는 방법

시작

 

A, B는 피보나치 초항

 

SUM 초기값

 

N을 3으로 하면 앞으로 더할 값/ N이 2면 지금 SUM에 참여한 값(A, B 두 개 참여함)

 

A, B를 합한 값 = C

 

SUM이 바뀌는 부분

 

단계 올라감

 

N+1은 지금까지 한 항의 수 

 

N =100이면 다음에 할 N이 아닌 현재 참여한 N의수 

100보다 작으면 돌아간다.

 

 

 

 

피보나치수열 이용해 디버깅 표 만들기

A B S N C N=1


수열

수열 : 규칙에 따라 숫자들이 차례대로 나열된 것

EX) 1부터 100까지의 자연수의 합을 구하는 알고리즘

  • 등차수열
  • 등비수열
  • 피보나치 수열
  • 공차

+ 문제

서로 다른 자연수 2개를 받아 그 사이에 존재하는 자연수의 합과 3의 배수의 제곱의 합을 구하여 출력하는 알고리즘.

힌트 : MOD( i,3 ) = 3의 배수 알아낼 수 있는 함수.

N1, N2 : 입력된 2개의 자연수 (단 N1 < N2)

i : 반복 처리를 위한 변수

S1 : 두 자연수 사이에 존재하는 자연수의 합

S2 : 두 자연수 사이에 존재하는 3의 배수의 제곱의 합

 

 

 

 

① 0

 

② N1

 

③ N2

 

④ S1

 

⑤ i * i

 

 

 

 

 

 

 

 

 

 


누승 알고리즘 (팩토리얼)

N!  = N에 대한 누승

     = 1 × 2 × 3 × --- ×  N

팩토리얼 순서도

N : 자연수 1부터 100까지 보관하는 변수 , 초깃값 1

F : 자연수 N에 대한 누승을 보관하는 변수

S : 자연수의 누승의 합을 보관하는 변수

 

시작

 

 

초기화

 

 

 

반복시작

 

N은 앞으로 처리

 

이전의 N-1에 N 을 곱한다.

 

 

 

N은 처리한것임. 방금 처리한게 100인지 확인

 

 

출력 

 

 

+ 누승을 재귀호출로 구하는 방법

10! => 9! * 10 => 8! * 9 ... 1! *2


동적 알고리즘

동적프로그래밍 사용하는 경우

1. 최적부분구조 성격의 문제일때

- 최적부분구조의 문제 : 큰 문제의 해답을 구하는 과정 안에 작은 문제의 해답을 구하는 과정이 포함된 경우

- Ex) 자연수 n의 팩토리얼을 재귀호출을 통해 구할 경우 (재귀호출할시 중복호출 비효율성이 크지 않아 동적프로그래밍을 사용하지 않음)

- Ex) 피보나치의 수열을 재귀호출을 통해 구할 경우 ( 최적부분의 구조 문제 + 재귀호출할때 중복 호출의 비효율성이 크므로 동적 프로그래밍을 사용함)

 

2. 재귀호출 할때 중복호출의 비효율성이 심각한 경우 = 부분 문제 반복

 

피보나치 수열에 대한 정의

A1 = 1, A2 =1

An = An-1 + An-2 (n>=2인경우)

N번째 피보나치 수열 항을 구하는 알고리즘, N번쨰 피보나치 수여ㅕㄹ 항까지의 합을 구하는 알고리즘

 

bottom-up방식의 동적 프로그래밍(반복구조 사용)

밑에서부터 올라가는

top-down 재귀호출방식

위에서부터 내려가는

중복계산이 많이 발생함

Top-down방식의 동적 프로그램(재귀호출 사용)

이미 계산되어 있는지 표에서 찾아봄. 중첩되는 것들이 재계산되지 않음

팩토리얼은 0보다 큰데 F(1000)을 0으로 둠

첫번째로 table check F(N)=0 : 한번도 피보나치수열을 계산시킨적 없다는 뜻

0이 아니면 F(N)의 값을 리턴함. 새로 없는 것은 갱신

첫번째 호출할때만 계산하고 나머지는 보관했다가 사용.


제곱수열과 교행 자연수 수열 알고리즘

제곱의 합

S = (100*1)² + (99*2)² + (98*3)² + --- + (3*98)² + (2*99)² + (1*100)²의 합 구해 출력하는 알고리즘

수열 100개 = 100번 반복

(B * A)² : B와 A의 합 100 -> B = 101 - A

 

 

변수 선언

 

A = 1

 

B =100

 

C = 100 * 1

(100 * 1 )² -----반복

 

수열의 합 구하는 S에 새로운 항 C더하기

 

A 100보다 작으면 반복

 

출력

 

 

+ , - 교행 자연수 수열

S = 1 - 2 + 3 - 4 + 5 - 6 --- - 100 = (-1) 50번 반복

 

 

 

 

 

 

 

+1 +3 +5 ---

 

 

-2 -4 ---

 

N =100일때 끝

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SW = -SW

+1 -1 +1 -1반복되며 누적

 

 

 

스위치 변수 사용하지 않고 구하는 방법 (짝수, 홀수 이용한 방법)

MOD(N,2) = 0 짝수

MOD(N,2) = 1 홀수

 

짝수일때 빼고 홀수일때 더하는

 

S = 5 - 10 + 15 -20 + --- -500

 

NN은 5*N값

N을 2로 나눈 값 = 1 홀수

홀수면 NN을 더하고 짝수이면 NN을 뺀다.

 

 

 

+ Recent posts