[Hy-코딩테스트] 잡다한 것 정리
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);
}