본문 바로가기
KraftonJungle2기/Today I Learned

[TIL] Make란? + stack 문제 풀이

by SooooooooS 2023. 5. 7.
728x90

1. Make

소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구
여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며
최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있다.
Makefile : make를 실행하기 전에 프로젝트의 목록 및 컴파일 및 링크 규칙

1. Makefile 이 필요한 이유

  • 반복된는 컴파일 작업 시간이 오래 걸린다.
  • 수정된 파일만 컴파일할 수 있다.
  • 대규모 프로젝트나 공동 프로젝트에서 반드시 필요하다.

2. 컴파일 과정

  1. 소스 파일(*.c) : 우리가 작성한 코드
  2. 목적파일(*.o) : gcc compiler 를 이용하여 생성 → 기계어 생성
  3. 실행파일(*.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

make 실행 후 실행 파일 실행하기


  • 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
 

GitHub - ChoSooBeen/CWORKSPACE: C언어 - 학습코드 정리

C언어 - 학습코드 정리. Contribute to ChoSooBeen/CWORKSPACE development by creating an account on GitHub.

github.com

 

 

구현한 연결리스트 make 사용해보기
https://github.com/ChoSooBeen/CWORKSPACE/tree/main/LinkedListExample
 

GitHub - ChoSooBeen/CWORKSPACE: C언어 - 학습코드 정리

C언어 - 학습코드 정리. Contribute to ChoSooBeen/CWORKSPACE development by creating an account on GitHub.

github.com

 

< 참고 >

🔗 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