백준/c 28

백준_10810_공넣기

바구니에 공을 넣는 문제입니다. 공이 들어가지 않으면 0을 출력해야 하므로 배열을 만들고 0으로 초기화를 해줘야 할 것 같습니다. 또한, i번 바구니부터 j번 바구니까지 공을 넣는데 배열의 인덱스는 0부터 시작하므로 이 점을 주의해야 할 것 같습니다. 전체 코드) #include int main(void) { // 바구니의 개수와 공을 넣을 횟수 입력받기 int N = 0, M = 0; scanf("%d %d", &N, &M); // 바구니 배열 생성하고 초기화 int basket[N]; for (int i = 0; i < N; i++) { basket[i] = 0; } // 공을 넣을 바구니의 범위와 공의 번호를 입력받아 바구니에 넣기 int i = 0, j = 0, k = 0; for (int p =..

백준/c 2024.04.24

백준_25304_영수증

매우 간단한 문제입니다. 입력받은 물건의 가격과 개수를 이용해 총 가격을 구하는 문제이죠. #include int main(void) { int x = 0, n = 0, a = 0, b = 0; scanf("%d\n%d", &x, &n); int sum = 0; for (int i = 0; i < n; i++) { scanf("%d %d", &a, &b); sum += a * b; } if (x == sum) { printf("yes\n"); } else { printf("no\n"); } return 0; } 하지만 틀렸습니다.. yes/no 가 아니라 Yes/No 를 출력했어야 했네요... #include int main(void) { int x = 0, n = 0, a = 0, b = 0; scan..

백준/c 2024.04.24

백준_15829_Hashing

문제가 굉장히 깁니다. 해시 함수) 해시 함수란, 임의의 길이의 데이터를 고정된 길이의 데이터로 출력하는 함수입니다. 자료구조에서도 사용되고, 암호용으로 사용되기도 하죠. 이 문제에서는 알파벳(a~z) 에 1~26까지 순서대로 고유 번호를 부여하여 해시 값을 계산합니다. 하지만, 이렇게만 하면 비둘기 집의 원리* 에 의해 중복되는 해시 값을 가질 수 있습니다. (문자열은 다르지만 구성하는 알파벳이 같다면 해시 값이 동일하게 나옵니다.) 따라서, 충돌(중복)이 최대한 적게 일어나게 하기 위해 각 항에도 고유 번호(항의 번호에 해당되는 만큼 특정 숫자를 거듭제곱해 곱해주기)를 부여합니다. 최종적으로 이 함수가 문제에서 말하는 해시 함수입니다. 이 함수는 자주 쓰인다고 하니 꼭 기억해두는게 좋을 것 같습니다...

백준/c 2024.04.23

백준_2525_오븐시계

문제 풀기 전 생각) 시간이 24가 되면 0으로 바꾸는 것, 60분이 넘어가면 시간이 1 늘어나는 것만 신경쓰면 될 것 같습니다. 풀이) 걸리는 시간(time)을 현재 분(min)에 더한 뒤, 분이 60분을 넘어갔을 때와 시간이 24시가 되었을 때의 조건을 추가해주었습니다. 전체 코드) #include int main(void) { int hour = 0, min = 0, time = 0; scanf("%d %d\n%d", &hour, &min, &time); min += time; if (min >= 60) { hour += min / 60; min %= 60; if (hour >= 24) { hour -= 24; } } printf("%d %d\n", hour, min); return 0; } 60분..

백준/c 2024.04.23

백준_10926_??!

입력한 문자열 뒤에 ??! 만 붙여 출력하면 되는 간단한 문제입니다. 하지만 아래와 같이 코드를 작성하면 printf("%s??!",id); 이런 warning 이 나옵니다. stackoverflow를 살펴보니, ??! 은 \ 로 대체된다고 합니다. ??! 이외에도 다른 문자들도 있으니 주의해야 할 것 같습니다.. 어쩐지 문제가 너어무 쉽다 했네요.. ISO 646 character set(문자 모음)은 C의 모든 문자를 포함하고 있지 않으므로 \를 이용해야 한다고 합니다. 전체 코드) #include int main(void) { char id[51] = {0}; scanf("%s", id); printf("%s\?\?!\n", id); return 0; } trigraph에 대해 알아보기 위한 문제인..

백준/c 2024.04.23

백준_2798_블랙잭

문제설명) 자연수가 적힌 N장의 카드를 숫자가 보이도록 바닥에 놓고 M을 외친다. 플레이어는 M을 넘지 않으면서 M과 가장 가깝도록 3장의 카드를 고른다. N장의 카드에 써져있는 숫자가 주어졌을 때, 카드 3장의 합을 구하시오. 문제 풀기 전 생각) 100장 이하의 카드가 주어지므로, 배열과 반복문을 이용하여 풀면 괜찮을 것 같습니다. 풀이) N,M 을 입력받은 후 N만큼 배열을 입력받습니다. 그 후, 3중 for 문을 이용하여 M과 가장 가까우면서 가장 큰 값을 찾습니다. 이때, 카드의 합이 M을 넘으면 안되므로, 조건을 추가해줍니다. 또한 카드의 합이 M과 같아지면 더이상 탐색의 의미가 없으므로 그 값을 출력하고 즉시 종료합니다. 전체 코드) #include int main(void) { int N ..

백준/c 2024.04.22

백준_2292_벌집

문제 풀기 전 생각) 연속되는 숫자가 원형을 그리며 시계방향으로 회전하고 있으므로 규칙을 찾아 문제를 풀어야겠다는 생각을 했습니다. 1을 기준으로 직선을 그어보면, 1->5->15->31->53 (+4, +10, +16, +22) 1->7->19->37->61 (+6, +12, +18, +24) 보다시피 커지는 숫자가 6씩 증가하고 있습니다. 위 규칙을 이용해서, 입력받은 숫자에서 -6, -12, -18 .... 을 하며 몇 번 연산되었는지 세어보면 몇 번째 궤도에 위치해 있는지 구할 수 있을 것 같습니다. 풀이) N을 입력받아 규칙이 몇 번 사용되었는지를 확인하도록 프로그래밍합니다. 궤도가 올라갈수록 가장 작은 값과 가장 큰 값의 차이가 커지므로 이를 해결할 수 있도록 공식을 세웁니다. 1.규칙이 몇 ..

백준/c 2024.04.22

백준_2231_분해합

분해합의 개념) 어떤 자연수 N이 있을 때, N의 분해합은 N+각 자리수의 합입니다. 예를 들어, 198의 분해합은 198 + 1 + 9 + 8 = 216 입니다. 이때 198은 216의 생성자라고 합니다. 문제 풀기 전 생각) N이 백만 이하의 자연수이므로 1부터 하나하나 검사를 하기에는 시간이 너무 오래 걸릴 것 같습니다.(주어진 시간도 2초로 짧습니다.) 분해합은 생성자와 각 자리수를 모두 더한 것인데, 각 자리수가 될 수 있는 가장 큰 값은 9입니다. 그러므로, 분해합-자리수*9 를 한 수가 생성자 될 수 있는 최솟값이 되는 것이죠. 예를 들어 주어진 분해합이 256일 때 우리는 256 - 3*9 = 229 부터 검사를 하면 되는 것입니다. 풀이) 1. 먼저, 분해합을 입력받아 몇 자리수인지 구합..

백준/c 2024.04.22