make a splash
728x90
article thumbnail
[Hackerrank] Viral Advertising
문제풀이/C 2020. 11. 23. 13:32

문제 5명으로 시작해서 절반(나머지 버림)이 좋아하는 반응을 보이고, 그 2명이 다시 각자 3명씩에게 전한다. 입력받은 n 단계만큼 거쳐왔을 때 좋아하는 반응을 보인 사람을 구하자 풀이 5명으로 시작해서 2로 나누는 수를 계속해서 저장할 count 변수와 단계마다 사람의 수를 바꿔나갈 변수 p를 사용한다. 코드 int viralAdvertising(int n) { int count = 0; int p = 5; for(int i=0; i

article thumbnail
[HackerRank] Find Digits
문제풀이/C 2020. 11. 22. 16:30

문제 정수가 주어지면 정수를 구성하는 각 자릿수를 확인하고, 정수의 개수를 구하자 풀이 10으로 계속 나누는 식으로 각 자리 값을 확인한다. ( 배열에 저장하고 비교, 문자열로 인식하고 비교해도 될 것 같다 ) 코드 int findDigits(int n) { // n : 나눠야 할 수 int r = n; int count = 0; while(r > 0) { // 나머지가 0이 아니고 && 이전에 저장된적 있다면 if(r % 10 != 0 && n % (r % 10) == 0) count++; r = r / 10; // 자리수대로 자르기 } return count; } 결과

article thumbnail
[Hackerrank] Forming a Magic Square
문제풀이/C 2020. 11. 19. 10:07

문제 주어진 3*3 행렬은 1~9의 수를 가진다. 절댓값의 cost가 작은 수로 행렬의 수를 바꿀 수 있다. cost의 최솟값을 출력하자. 풀이 입력받은 행렬을 하나하나씩 비교하여 절댓값을 계산하려다가, magic matrix의 중간값은 5뿐이며, 절댓값이 최소가 되려면 (1,9),(2,8),(3,7),(4,6)의 조합을 중간의 5 주위로 배열해야한다는 것을 알았다. 홀수 조합이 첫째 줄에 오는 경우는 불가능하기 때문에 짝수 조합들이 첫째 줄에 오는 방향을 생각했고, 가능한 3*3 행렬은 8가지 경우 였다. 8가지 경우의 행렬을 제시하고 입력받은 행렬과 비교하여 가장 절댓값의 크기가 작은 수를 리턴한다. 코드 int formingMagicSquare(int s_rows, int s_columns, int..

article thumbnail
[Hackerrank] Bill Division
문제풀이/C 2020. 11. 19. 10:04

문제 두 친구 Anna와 Brian은 어떻게 계산서를 분할할지 결정하고 있다. 각자 소비 한 항목에 대해서만 비용을 지불한다. Brian은 수표를 받고 Anna의 부분을 계산한다. 그의 계산이 올바른 지 확인한다. 코드 void bonAppetit(int bill_count, int* bill, int k, int b) { int total = 0; // 메뉴 갯수만큼 반복 for (int i = 0; i < bill_count; i++) { // 먹지 않는 메뉴 가격제외 if (i != k) total += bill[i]; } // 되돌려주는 값이 딱 맞아 떨어진다면 Bon Appetit 출력 if(total / 2 == b) printf("Bon Appetit"); else{ // 돌려줘야할 값 출력..

article thumbnail
[Hackerrank] Electronics Shop
문제풀이/C 2020. 11. 19. 09:58

문제 예산안에서 키보드 1개와 드라이브 1개를 구매하는데, 가장 비싼 조합으로 구매하는 가격을 출력해야한다. 풀이 getMoneySpent 함수는 키보드 개수, USB개수, 개수가 든 배열을 받고 있다. 배열의 모든 경우의 수를 비교하고, 부등호를 이용해서 가장 큰 값을 max에 저장한다. 구매할 수 없는 경우 -1을 리턴한다. 코드 int getMoneySpent(int keyboards_count, int* keyboards, int drives_count, int* drives, int b) { // 둘다 살 수 없을 경우 리턴 -1 int max=-1; // 키보드 수만큼 반복 for(int i=0;i

article thumbnail
[Hackerrank] Compare the Triplets
문제풀이/C 2020. 11. 18. 17:10

문제 Alice와 Bob의 세 점수를 비교해서 높은 점수를 가진사람이 1점을 가져간다. 둘의 점수를 출력하자. 풀이 main함수에서 a_count와 b_count가 3으로 되어있는데, 딱히 어디 써야 하는지... 모르겠다. 점수가 들어있는 a와 b의 배열을 각각 비교해서 result 배열에 점수를 넣는다. 코드 int* compareTriplets(int a_count, int* a, int b_count, int* b, int* result_count) { // a_count = 3, b_count = 3 // *a, *b : int 3개짜리 값이 들어있는 배열 // result_count : 아무것도 선언되지 않은 int 값,,, static int result[2] = {0, }; *result_c..

article thumbnail
[Hackerrank] Drawing Book
문제풀이/C 2020. 11. 8. 09:50

문제 선생님이 학급에게 책을 페이지 번호로 열도록 요청한다. 학생은 책의 앞면이나 뒷면에서 페이지 넘기기를 시작할 수 있다. 항상 한 번에 한 페이지 씩 넘기고, 책을 열면 1페이지는 항상 오른쪽에 있습니다. 가장 적게 페이지를 넘기는 횟수를 알아내자. 풀이 첫페이지가 반드시 오른쪽에 위치하므로, 2로 나눴을 때 몫을 이용해서 풀 수 있다. 이동 전과 후의 쪽 수를 받아서, 두 페이지의 차를 구하면 된다. 그 차이를 비교해서 앞으로 넘길 때와 뒤로 넘길 때의 경우를 나눠주면 된다. 코드 int pageCount(int n, int p) { // n : 이동 전 페이지, p : 이동 후 페이지 // 책을 폈을 때 두 페이지가 보임 // n/2 : 이동 전 쪽 수, p/2 : 이동 후 쪽 수 int min ..

article thumbnail
[Hackerrank] Library Fine
문제풀이/C 2020. 11. 8. 09:27

문제 지역 도서관 도서의 예상 및 실제 반환 날짜가 주어지면, 벌금을 계산하는 프로그램을 만든다. 같은 연도 같은 달 다른 일 : (연체 일 수) * 15 같은 연도 다른 달 : (연체 달 수) * 500 다른 연도 : (연체 연 수) * 10000 풀이 받은 일,월,년 순으로 벌금 기준에 따라 if else 문을 작성한다. 1월 2일 대여, 1월 1일 반납으로 입력이 되었을 때도 0을 반환해 주어야해서 모든 경우의 수로 날짜가 연체됐을 때, 같을 때, 이전의 날짜일 때를 나누어서 해줬다. 코드 int libraryFine(int d1, int m1, int y1, int d2, int m2, int y2) { int score = 0; if(y1==y2){ // 연도가 같을 때 if(m2==m1){ /..

article thumbnail
[Hackerrank] Utopian Tree
문제풀이/C 2020. 10. 11. 16:56

문제 나무가 period별로 자라는 길이를 구한다. 봄에는 2배로 커지고, 여름에는 1씩 커진다. period를 입력받고, 그에 따른 나무의 키를 출력한다. 풀이 처음에 while문으로 %2의 나머지에 따라 *2를 하거나 +1을 하는 방법을 생각했다. period 별로 나무의 길이를 몇 번 써보다 보니 제곱으로의 규칙을 찾게 되어서 pow 함수로 제곱을 하는 방법으로 했다. period가 홀수일 때 : 2의 (period/2 +1) 제곱 -1 period가 짝수일 때 : 2의 ((period+3) /2) 제곱 -2 코드 int utopianTree(int n) { // n : Season int h = 1; if(n==0) return 1; if(n%2==0){ h = pow(2,((n/2) + 1))-..

article thumbnail
[Hackerrank] Sherlock and Squares
문제풀이/C 2020. 10. 11. 01:31

문제 Watson은 Sherlock의 수학능력에 도전하는 것을 좋아한다. Sherlock이 두 정수 범위를 정해주면, 그 사이에 있는 제곱수의 갯수를 출력해야 한다. 풀이 두 수의 범위인 int a, int b를 매개변수로 받는다. a보다 작은 제곱수인 x를 구하고, b보다 작은 제곱수가 있으면 num을 1씩 증가시킨다. num을 리턴시킨다. while문을 통해 a보다 작은 제곱수인 x를 구하는데 x++를 한 후에 while문의 루프 검사를 돌기 때문에, b를 검사할 때는 x++을 해주지 않아도 된다. 코드 int squares(int a, int b) { int num = 0; int x = 1; while(x*x < a){ // a보다 작은 x제곱 찾기 x++; } while(x*x

728x90