#10726 : 이진수 표현
[코드]
[코드설명]
① main
테스트케이스를 TC에 입력 받고, for문으로 TC만큼 실행을 반복한다.
정수 N, M을 변수 N, M에 담고 while문으로 N과 M이 1 ≤ N ≤ 30 , 0 ≤ M ≤ 108을 만족할 때까지 입력 받는다.
N과 M을 입력 받으면 bitcheck함수로 인자를 전달하고, 결과를 테스트케이스 번호와 함께 출력한다.
② bitcheck
main함수에서 N과 M을 전달받는다.
정수 M의 마지막 N개의 비트가 모두 1인지 검사하기 위해서 정수 M의 2진수 표현에서 마지막 N비트만큼을 추출했다. 마지막 N비트는 1, 나머지는 0으로 채워진 수 ~(~0<<N)와 M을 비트 AND연산하면 M의 2진수 표현에서 마지막 N비트만큼을 추출할 수 있다. M & ~(~0<<N) 연산 후에 연산 결과를 변수 M에 저장했다.
추출한 마지막 N비트가 모두 1인지 확인하기 위해서 비트 XOR연산을 이용했다. M ^ ~(~0<<N) 연산을 하면 마지막 N개의 비트만 NOT연산을 한 것 같은 결과가 나온다. 만약 마지막 N개의 비트가 모두 1이라면 연산 결과는 0이 되고, 아니라면 0이 아니게 된다. 따라서 if문에서 M이 0이면 ON을 반환하고, 0이 아니면 OFF를 반환한다.
[실행결과]
/*
#include<stdio.h>
#include<math.h>
char* check_bits(int N, int M);
int main()
{
int TC = 0, N, M;
printf("testcase : ");
scanf("%d", &TC);
for (int t = 1; t <= TC; t++)
{
printf("\nN M : ");
scanf("%d %d", &N, &M);
printf("#%d %s\n", t, check_bits(N, M));
}
}
char* check_bits(int N, int M)
{
int bit;
bit = M & ~(~0 << N);
return (bit == pow(2, N) - 1) ? "ON" : "OFF";
}
*/
#8931 : 제로
[코드]
[코드설명]
① main
테스트케이스를 입력 받아 TC에 저장하고, for문으로 TC만큼 실행을 반복한다.
정수 K를 입력 받아 변수 K에 저장하고, while문으로 K가 1 ≤ K ≤ 100,000 조건을 만족할 때까지 입력 받는다.
K를 zero함수로 전달하고, 반환값을 테스트케이스 번호와 함께 출력한다.
② zero
zero함수는 main함수로부터 정수 K를 전달받는다.
동아리 지출 금액을 저장하기 위해서 malloc함수로 포인터 변수 numarr에 sizeof(int)*K크기의 메모리를 할당한다.
for문으로 동아리 지출 금액 추가와 삭제를 위한 입력을 K번 반복한다.
numarr[index]에 동아리 지출 금액 추가 혹은 삭제를 위한 정수를 입력 받고, if문으로 numarr[index]가 0인지 확인한다.
numarr[index]가 0이면 numarr[index-1]에 0을 대입해서 이전 인덱스에 저장된 값을 삭제하고, index가 2감소한다.(다음 반복으로 넘어가면서 index가 1증가하기 때문에 여기서 2를 감소해야 한다.) numarr[index]가 0이 아니면 다음 반복으로 넘어가서 index가 1증가된다.
두 번째 반복문에서 k가 0부터 index전까지 증가하면서 sum에 numarr[k]값을 저장해간다. 모든 반복문이 끝나면 free함수로 numarr에 할당된 메모리를 해제하고, sum을 반환한다.
[실행결과]
'알고리즘' 카테고리의 다른 글
[SWEA] 10059/9700 (0) | 2020.11.06 |
---|---|
[SWEA] 9317/10804 (0) | 2020.10.31 |
[SWEA] 9940/10032 (0) | 2020.09.24 |
[SWEA] 10570/10200 (0) | 2020.09.18 |
C정리 3주차 (0) | 2020.07.11 |