728x90
1. Make
소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구
여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며
최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있다.
Makefile : make를 실행하기 전에 프로젝트의 목록 및 컴파일 및 링크 규칙
1. Makefile 이 필요한 이유
- 반복된는 컴파일 작업 시간이 오래 걸린다.
- 수정된 파일만 컴파일할 수 있다.
- 대규모 프로젝트나 공동 프로젝트에서 반드시 필요하다.
2. 컴파일 과정
- 소스 파일(*.c) : 우리가 작성한 코드
- 목적파일(*.o) : gcc compiler 를 이용하여 생성 → 기계어 생성
- 실행파일(*.out) : gcc compiler를 사용해서 생성된 목적 파일과 라이브러리를 Link해서 생성
예시 ) main.h, main.c, kor.c, usa.c 파일을 컴파일하는 방법
★ gcc를 이용하여 해보기 ★
- gcc -c : 소스파일(*.c)로 목적파일(*.o) 만들기
- gcc -c main.c kor.c usa.c
- 결과 : main.o, kor.o, usa.o 생성
- gcc -o : 목적 파일(*c)을 linker 과정을 통해 실행파일(*.out) 만들기
- gcc -o app.out kor.o main.o usa.o
- 결과 : app.out 생성
- ./app.out 명령어로 실행
3. Makefile 사용법
- all : 최종적으로 만들 것을 명시
- tafget : 만들고자 하는 것
- dependency(prerequisites) : target을 만들 때 의존성 규정(= 만들 때 필요한 것)
- command(recipe) : target을 만들기 위한 명령어(주로 리눅스 명령어 사용)
※ 앞에 tab을 사용하고 입력해야한다.
(예시)Makefile
all: app.out
app.out: main.o kor.o usa.o
gcc -o app.out main.o kor.o usa.o
main.o:
gcc -c main.c
kor.o:
gcc -c kor.c
usa.o:
gcc -c usa.c
- Makefile 문법
- 변수 선언 : 변수 이름 = 값
- 사용법 : $(변수명)
- $@ : target과 같은 변수를 사용할 때
- $^ : dependency와 같은 변수를 사용할 때
- $< : 소스파일들을 나타낼 때 사용
- CC : 컴파일러
- OBJS : 목적 파일 목록
- .c.o : 현재 디렉토리 내에 있는 모든 소스파일을 목적파일로 바꾸고 싶을 때 쓰는 target
- CFLAGS : Compile 옵션
- LBFLAGS : Linker 옵션
- clean : build 결과무로가 부산물 삭제
- 변수 선언 : 변수 이름 = 값
- 수정된 파일이 생긴 후 make 실행 시 : 수정된 파일만 다시 컴파일된다.
(위의 문법을 적용한) Makefile
CC = gcc
TARGET = app.out
OBJS = main.o kor.o usa.o
CFLAGS = -Wall
LDFLAGS = -lc
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
.c.o:
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(OBJS) $(TARGET)
make 전체 학습 코드
https://github.com/ChoSooBeen/CWORKSPACE/tree/main/MakefileExample
구현한 연결리스트 make 사용해보기
https://github.com/ChoSooBeen/CWORKSPACE/tree/main/LinkedListExample
< 참고 >
🔗 https://youtu.be/jnJL6ppn26Q
🔗 https://ko.wikipedia.org/wiki/Make_(소프트웨어)
🔗 https://www.tuwlab.com/ece/27193
2. 문제 풀이
1. 17298번 - 오큰수
import sys
N = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))
def NGE(nums, N) :
stack = [nums[N-1]]
result = [-1] * N
for k in range(1, N) :
idx = N-1-k
n = nums[idx]
# 현재 나보다 작은 모든 값 제거
while stack:
if stack[-1] > n :
break
stack.pop()
# 오큰수 입력
if stack :
result[idx] = stack[-1]
else :
result[idx] = -1
stack.append(n)
print(*result)
NGE(nums, N)
시간 초과를 많이 낸 문제
생각해보니 나보다 오른쪽을 보기 위해 입력받은 수를 거꾸로 확인하면서 나보다 큰수만 stack에 존재하도록 저장
stack에서 pop을 하여 최대한 이중 반복문이 커지지 않도록 해야했다.
직접 끝까지 푸니 뿌듯하다.
728x90
'KraftonJungle2기 > Today I Learned' 카테고리의 다른 글
[TIL] RB Tree 구현 (with C) (0) | 2023.05.10 |
---|---|
[TIL] 기계 수준 표현3 + RB Tree 삽입 구현(코드X) (1) | 2023.05.08 |
[TIL] Red-Black Tree 개념(삽입/삭제) + 기계 수준 표현(스택)2 (0) | 2023.05.06 |
[TIL] LinkedList & AVL Tree (with C) (1) | 2023.05.05 |
[TIL] C언어 공부하기 (0) | 2023.05.04 |