본문 바로가기

SISS

(55)
[Implementation] Cut the Sticks 여러 개의 길이가 제각각인 막대가 주어진다. 가장 짧은 막대 길이만큼 모든 막대들을 자른다. 자르고 남은 막대들 중에서 또 가장 짧은 막대의 길이만큼 모든 막대들을 자른다. 이것을 계속해서 반복한다. 모든 막대를 잘라 버릴 때까지 각 횟수마다 자른 막대의 수를 알아내야 한다. 예를 들어, 막대의 길이가 각각 (5, 4, 4, 2, 2, 8)이라면 여기에서 가장 짧은 막대의 길이는 2다. 2만큼 각각의 막대를 자르면 (3, 2, 2, -, -, 6)이 된다. 여기서 -는 다 잘라져 없어진 막대를 의미한다. 6개의 막대를 자른 것으로 볼 수 있다. 여기에서 가장 짧은 막대 길이 2만큼 자르면 (1, -, -, -, -, 4)가 된다. 자른 막대는 4개라고 볼 수 있다. 여기서 가장 짧은 막대 길이 1만큼 다..
old-03(350) 당황스러운 판이 나왔다. 열심히 문제를 풀어서 동물 발바닥 같은 모양이 나왔다. 그대로 solved 버튼을 클릭하니 이와 같은 페이지가 나왔다. 대충 na2na7을 입력하자 이러한 페이지가 나왔다. webhacking.kr/challenge/web-03/index.php?_1=1&_2=0&_3=1&_4=0&_5=1&_6=0&_7=0&_8=0&_9=0&_10=0&_11=0&_12=1&_13=1&_14=1&_15=0&_16=0&_17=1&_18=0&_19=1&_20=0&_21=1&_22=1&_23=1&_24=1&_25=1&_answer=1010100000011100101011111 URL을 복사해 보았다. 뒤에 answer라고 1과 0으로 이루어진 문자열이 있다. 1번 칸에서 25번 칸까지 까맣게 칠해졌으면..
[Implementation] Strange Counter 밥은 신기한 카운터를 가지고 있다. 이 카운터는 처음에는 숫자 3을 나타내고, 각 초마다 1이 될 때까지 1씩 감소한다. 1이 되고난 후에는 3에 2를 곱한 값이 6이 되고, 또다시 각 초마다 1이 될 때까지 감소한다. 시간(t)가 주어졌을 때 t초 후에는 카운터에 어떤 숫자가 나타날지 알아내야 한다. 각각의 time배열과 value 배열은 같은 쌍배열 내에서는 그 합이 일정하다. 주어진 그림의 맨 왼쪽은 4로 일정하고, 가운데는 10, 오른쪽은 22로 일정하다. 그리고 이 합은 이전 합에 현재 쌍배열의 value[0]을 더한 값과 같다. 예를 들어, 가운데를 현재 쌍배열이라고 한다면, 이 쌍배열 각 인덱스끼리의 합은 10(4+6, 5+5...)으로 일정하다. 이전 합은 4이고, 현재 쌍배열의 value..
old-08(350) getenv(): 환경변수를 가져오는 함수이다. 여기서는 "HTTP_USER_AGENT"라는 환경변수를 가져온다. $SERER['HTTP_USER_AGENT']는 접속자의 접속 브라우저를 의미한다. trim(): 문자열의 맨 앞과 맨 뒤의 여백을 제거한다. $_SERVER['REMOTE_ADDR']: 웹서버에 접촉한 접속자의 IP를 의미한다. 접속자의 IP를 $ip에 저장한다. $agent에 from이 들어가 있으면 Access Denied를 출력하고, $agent를 출력한다. count(): sql에서 테이블에 존재하는 데이터의 개수를 가져온다. 이때, NULL인 것은 제외한다. chall8이라는 table에서 id의 개수를 구해 $count_ck에 저장한다. 만약 그 개수가 70개 이상이면 chall..
[Sorting] Correctness and the Loop Invariant 삽입 정렬을 이용하는 문제다. 저번 Insertion Sort-Part2 와 비슷하다. 한 가지 다른 점은, 이번에는 정렬을 마치고 난 후에 정렬한 결과를 출력하는 것이다.
[Implementation] Repeated String 문자열 s와 정수 n이 주어진다. 문자열의 길이가 n이 되도록 s를 반복한다. s가 aba이고 n이 7이라면 aba를 반복한 결과는 abaabaa가 된다. 이 결과에서 'a'가 몇개인지 구해야 한다. 먼저 주어진 문자열 s에서 'a'의 개수를 구한다. s의 길이가 n이 되도록 반복한다면, 반복한 결과 안에서 s의 수는 n / (strlen(s))이다. 이 수에 s에서의 'a'의 개수를 곱한다. 그 뒤, 반복문을 돌면서 0부터 n을 strlen(s)를 나눈 나머지가 되기 전까지의 인덱스들에 대해 'a'의 길이를 구하면 된다.
[Sorting] Insertion Sort - Part 2 삽입정렬을 구현해야 한다. 19번 줄에서 for문의 조건문 중 temp < arr[j]에서 부등호의 방향을 로 하면 내림차순으로 정렬된다.
[Implementation] Counting Valleys 어떤 여행자가 해수면의 고도부터 시작하여 계곡을 지난다. 여행자가 지나는 길 문자열 path가 주어진다. path는 U와 D로 이루어져 있는데, U는 일정 단위 만큼 고도가 증가하는 것이고, D는 일정 단위 만큼 고도가 감소하는 것이다. 여행자가 해수면보다 낮은 고도에서 해수면으로 올라왔을 때 계곡 1번을 지난 것으로 간주한다. path가 주어질 때, 여행자가 몇 개의 계곡을 지나는지 구해야 한다. for문으로 path의 i번째 문자에 따라 고도를 증가시키거나 감소시켰다. 고도가 증가하여 level이 0이 되었을 때는 계곡을 지난 것으로 간주하고 valley를 1 증가시킨다.