본문 바로가기

SISS/HackerRank(C)

(24)
[Implementation] Cut the Sticks 여러 개의 길이가 제각각인 막대가 주어진다. 가장 짧은 막대 길이만큼 모든 막대들을 자른다. 자르고 남은 막대들 중에서 또 가장 짧은 막대의 길이만큼 모든 막대들을 자른다. 이것을 계속해서 반복한다. 모든 막대를 잘라 버릴 때까지 각 횟수마다 자른 막대의 수를 알아내야 한다. 예를 들어, 막대의 길이가 각각 (5, 4, 4, 2, 2, 8)이라면 여기에서 가장 짧은 막대의 길이는 2다. 2만큼 각각의 막대를 자르면 (3, 2, 2, -, -, 6)이 된다. 여기서 -는 다 잘라져 없어진 막대를 의미한다. 6개의 막대를 자른 것으로 볼 수 있다. 여기에서 가장 짧은 막대 길이 2만큼 자르면 (1, -, -, -, -, 4)가 된다. 자른 막대는 4개라고 볼 수 있다. 여기서 가장 짧은 막대 길이 1만큼 다..
[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..
[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 증가시킨다.
[Implementation] Picking Numbers 0보다 크고 100보다 작은 정수들(각 수들은 중복될 수 있다.)로 이루어진 배열이 있고, 배열의 크기는 2이상 100이하이다. 배열에서 서브배열을 하나 만드는데, 이때 서브 배열들의 원소끼리는 같거나 차가 1이어야 한다. 퀵 정렬을 이용하여 주어진 배열을 크기순으로 배열하고 start(맨 처음 원소, 즉 처음 실행할 때는 가장 작은 원소)와 원소들의 차를 차례대로 구해가면서 차가 1보다 클 때, count가 max보다 크면 max에 count를 저장한다. 그리고 1보다 큰 차가 난 원소를 start로 설정하고 아까 한 일을 그대로 반복한다. 주어지는 배열에는 여러 경우의 수가 있는데, 그 중 주어진 배열의 모든 원소가 같을 때를 생각하지 못하여서 오류가 났었다. 이 오류는 맨 마지막에 if문을 추가하여..
[Implementation] Sales by Match 양말 한 짝이 여러 개가 있다. 양말은 총 100가지 색깔의 종류가 있다. 먼저 각 색깔의 양말의 개수를 저장할 배열 socks를 만든다. 그 뒤, 모든 칸을 0으로 초기화한다. ar 배열을 for문으로 돌면서 양말의 색깔에 해당하는 socks의 칸의 값을 1씩 증가 시킨다. 그 뒤, 다시 for문으로 socks를 돌면서 각 칸을 2로 나눈 몫(켤레의 수)를 pairs에 더한다.