코딩테스트/C

[Hy-코딩테스트] 잡다한 것 정리

brotoo 2021. 9. 22. 20:03

1.     퀵소트 사용 방법

 

 - 퀵소트에서 기본적으로 compare함수가 필요하다. 여기서 나오는 것은 오름차순이고, 내림차순으로 정렬하려면 부등호 반대로 쓰면 된다.

int static upCompare(const void* first, const void* second){
    if (*(int*)first > *(int*)second){
        return 1;
    }
    else if (*(int*)first < *(int*)second){
        return -1;
    }
    else{
        return 0;
    }
}

 

 -  main에서 불러올 때는 이런 방식으로 사용한다.

qsort(arr, sizeof(arr), sizeof(int), upCompare);

 

2.     strlen - string 수 세기

strlen(string)

 

3.     dp 풀이 방법

 

- dp로 잡아주고, 재귀적으로 해서 풀어주면 된다. 

 

- dp는 먼저 작은 것으로 시작해서 재귀적으로 체크해주고, 점화식 만들어서 풀어준다.

dp[100000];

int fib(int n){

    if (n==0) return 0;

    if (n==1 || n==2) return 1;

    if (dp[n] != 0) return dp[n];

    return dp[n] = (fib(n-1) + fib(n-2))%1234567;

}

4. malloc 사용 방법

- 프로그래머스에서 malloc으로 동적할당을 해주는데, 이것을 가지고 answer를 풀이한다.

- 기본적으로는 answer에서 malloc(sizeof(int) * 배열 길이); 해주면 된다.

int* answer = (int*)malloc(sizeof(int)*prices_len);

answer에 집어 넣어주는 코드는 이런 방식으로 answer의 인덱스에 맞춰 하나하나 집어넣어주면 된다.

answer[i] = count;

5. 그리디 알고리즘 풀이

 

6. strchr  함수

 

7. 10진수를 2진수로 바꾸기

#include <stdio.h>
 
int main () {
    int num = 29;
    int binary;
    while(num > 0){
        binary = num %2;
        num /= 2;
        printf("%d",binary);
    }
    printf("\n");
    return 0;
}

8. BFS/ DFS 풀이

 

9. 문자열 -> 정수

#include <stdio.h>
#include <stdlib.h>    // atoi 함수가 선언된 헤더 파일

int main()
{
    char *s1 = "283";   // "283"은 문자열
    int num1;

    num1 = atoi(s1);        // 문자열을 정수로 변환하여 num1에 할당

    printf("%d\n", num1);   // 283

    return 0;
}

10. 문자열 배열로 접근

#include <stdio.h>

int main()
{
    char *s1 = "Hello";       // 포인터에 문자열 Hello의 주소 저장

    printf("%c\n", s1[1]);    // e: 인덱스 1(두 번째)의 문자 출력
    printf("%c\n", s1[4]);    // o: 인덱스 4(다섯 번째)의 문자 출력
    printf("%c\n", s1[5]);    // 문자열 맨 뒤의 NULL(\0) 출력. NULL은 화면에 표시되지 않음

    return 0;
}
e
o

 

문자 할당은 불가 !

실행을 해보면 문자열 포인터에 인덱스로 문자를 할당할 때 에러가 발생합니다. 왜냐하면 문자열 리터럴이 있는 메모리 주소는 읽기 전용이기 때문입니다. 따라서 문자열 포인터는 인덱스로 접근하여 문자를 할당하면 안 됩니다.

 

#include <stdio.h>

int main()
{
    char *s1 = "Hello";    // 포인터에 문자열 Hello의 주소 저장
                           // Hello가 있는 메모리 주소는 읽기 전용

    s1[0] = 'A';           // 문자열 포인터의 인덱스 0에 문자 A를 할당
                           // 실행 에러

    printf("%c\n", s1[0]);

    return 0;
}
0xC0000005: 0x00096BCC 위치를 기록하는 동안 액세스 위반이 발생했습니다.

 

- 배열 형태의 접근

 

#include <stdio.h>

int main()
{
    char s1[10] = "Hello";    // 크기가 10인 char형 배열을 선언하고 문자열 할당

    printf("%c\n", s1[1]);    // e: 인덱스 1(두 번째)의 문자 출력
    printf("%c\n", s1[4]);    // o: 인덱스 4(다섯 번째)의 문자 출력
    printf("%c\n", s1[5]);    // 문자열 맨 뒤의 NULL(\0) 출력. NULL은 화면에 표시되지 않음

    return 0;
}

 

이 경우 문자 할당 가능

 

#include <stdio.h>

int main()
{
    char s1[10] = "Hello";    // 크기가 10인 char형 배열을 선언하고 문자열 할당
                              // 배열에 문자열이 복사됨

    s1[0] = 'A';              // 문자 배열의 인덱스 0에 문자 A를 할당

    printf("%s\n", s1);       // Aello: 바뀐 문자열이 출력됨

    return 0;
}

문자열 길이 구하기

int main(void) {
    char *str1 = "SteemIt";    
    int i=0;
    int len=0;
    
    //첫번째 문자열 길이 구하기
    for(int i=0;str1[i];i++){
        len+=1;
    }
    printf("첫번째 문자열 길이 : %d \n",len);

dfs 풀이 (위 아래 visited 체크해주고, 0이면 start1,end1 설정 -> 원래 값 체크하고 if 값 맞으면 dfs 재귀로 넣어주기)

#include<stdio.h>
int computers[3][3] = {{1, 1, 0}, {1, 1, 1}, {0, 1, 1}}	;
int visited[200][200];
void dfs(int start, int end, int n){
    visited[start][end] = 1;
    int start1, end1;
    if (visited[start-1][end] == 0){
        start1 = start-1;
        end1 = end;
        if(computers[start1][end1] == 1){
            dfs(start1, end1, n);
        }
    }
    if (visited[start+1][end] == 0){
        start1 = start+1;
        end1 = end;
        if(computers[start1][end1] == 1){
            dfs(start1, end1, n );
        }
    }
    if (visited[start][end-1] == 0){
        start1 = start;
        end1 = end -1 ;
        if(computers[start1][end1] == 1){
            dfs(start1, end1, n);
        }
    }
    if (visited[start][end+1] == 0){
        start1 = start;
        end1 = end+1;
        if(computers[start1][end1] == 1){
            dfs(start1, end1, n);
        }
    }
}
int main(void){
    int n = 3;
    int count = 0;
    for (int i = 0; i < n; i++){
        for(int j = 0; j < n ;j++){
            if (computers[i][j] == 1 && visited[i][j] == 0){
                count++;
                dfs(i, j, n);
            }
        }
    }
    printf("%d", count);
}