1 . list 를 sort해줄때 key로 함수를 제공하면 리스트의 각 아이템에 한번씩 적용하면서 sort한다.
arr.sort(key=lambda x: (x[1], x[2]))
# If a key function is given,
# apply it once to each list item and sort them,
# ascending or descending,
# according to their function values.
- 오류 원인들
- 보호된 메모리에 접근 할때
- 읽기 권한이 없는 프로세스가 읽거나 쓰려고 할 때
- 할당된 메모리 이외 메모리에 접근할 때
프로그래밍 경우 발생 예
- pointer로 할당되지 않거나 잘못된 메모리로 접근한 경우
- 할당된 것보다 많은 문자를 입력한 경우 (주로 포인터를 사용하다 발생)
- 잘못된 자료형 형식 포맷 스트링을 사용할 경우
내 코드
#include <stdio.h>
struct person{
char gender;
int age;
};
struct person man1;
struct person* woman1;
int main(){
man1.gender='M';
man1.age=21;
woman1 ->gender=26;
// woman1 ->age='F';
printf("man1 is %dyears old and '%c'\n",man1.gender,man1.age);
return 0;
};
pointer로 할당되지 않거나 잘못된 메모리로 접근한 경우
수정 : woman1포인터가 가르키는 게 있도록 (man1)
int main(){
man1.gender='M';
man1.age=21;
printf("man1 is %dyears old and %c\n",man1.age,man1.gender);
//man1 is 21years old and M
woman1=&man1;
woman1 ->gender='F';
woman1 ->age=26;
printf("woman1 is %dyears old and %c\n",man1.age,man1.gender);
//woman1 is 26years old and F
return 0;
};
C에서의 string은 결국 포인터,배열이고 string을 출력하기 위해서는 헤더에 #include <string.h>
를 추가해줘야한다!
내 코드
#include <stdio.h>
#include <string.h>
int main(){
char s1[12]="Hello";
char s2[12]="World";
char s2_2[30]="WorldofCoding";
char s3[12];
/*s1문자열내에서 s2문자열이 처음 발견되는 포인터를 반환*/
// printf("strstr(s2_2,s2) : %c\n",(char)*strstr(s2_2,s2)); //strstr(s2_2,s2) : W
//printf("strstr(s2_2,s2) : %s\n",strstr(s2_2,s2)); //strstr(s2_2,s2) : WorldofCoding
return 0;
};
pointer
의 개념인 거 같아서 printf를 통해 출력값이 어떻게 달라지는 지 봤다. #include <stdio.h>
int max(int num1,int num2){
/*지역 변수 result*/
int result;
result=num1+num2;
int* p_num1=&num1;
int* p_num2=&num2;
int p_r=*p_num1+*p_num2;
// int* pr=&(p_num1+p_num2);
printf("p_num1: %p\n",p_num1); //0x7ffd990078cc
printf("p_num2: %p\n",p_num2); //p_num2: 0x7ffd990078c8
printf("result:%d\n",result);//result:30
printf("p_r: %d\n",p_r); //p_r: 30
return result;
}
int main(){
int a=10;
int b=20;
max(a,b);
return 0;
};
extern
으로 외부 함수에 접근하는 코드가 잘 안짜인다🤔import sys, heapq
input = sys.stdin.readline
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
lecture = [0 for _ in range(n+1)] #배정해줄 강의실
arr.sort(key=lambda x: (x[1], x[2]))# 강의 시간을 기준으로 정렬
room = []
def tmtbl(N):
for i in range(1, N+1):
# 강의의 종료시간과 강의실 번호 heap에 넣기
heapq.heappush(room, i)
minHeap = []
for x in arr:
# 힙에 값이 있고, 강의 시작 시간시간이 비교하고 있는 강의 종료시간보다 이르면 pop
while minHeap and minHeap[0][0] <= x[1]:
# 힙의 길이만큼의 인덱스를 강의실 번호로 지정하여 배열에 저장
_, r = heapq.heappop(minHeap)
heapq.heappush(room, r)
r = heapq.heappop(room)
heapq.heappush(minHeap, [x[2], r])
lecture[x[0]] = r # minHeap으로 아직 배정되지 않은 강의실에 강의실 번호 배정
return("\n".join(list(map(str,[max(lecture),*lecture[1:]]))))
print(tmtbl(n))
왜 포인터끼리 더해주면 안돼?
라는 생각이 들었는데, 찾아보니까 메모리가 저장되는 방식이 연속적인데 32비트 혹은 64비트 체제에서 이 범위를 초과한 덧셈결과가 나올 수 있어서라고 한다. 그래서 포인터끼리 빼준 값은 이 범위에 들어갈 수 있는데 (