Sad Puppy 3 개발자 아지트 :: 개발자 아지트
from collections import defaultdict, deque

def solution(graph, start):
    # 트리 생성 
    tmp_tree = defaultdict(list)
    for i, v in graph:
        tmp_tree[i].append(v)

    print(tmp_tree)
    
    def dfs(start):
        visited = set()
        queue = deque([start])
        visited.add(start)
        result.append(start)

        while queue:       
            node = queue.popleft() # 순차적으로 처리함 
            for injeop in tmp_tree.get(node, []):
                print('node', node, 'injeop', injeop)
                if injeop not in visited:
                    queue.append(injeop)
                    visited.add(injeop)
                    result.append(injeop)

    result = []
    dfs(start)  
    return result

'CodingTest > solved - Python' 카테고리의 다른 글

벨만포드 알고리즘  (0) 2024.04.09
다익스트라 알고리즘  (0) 2024.04.08
DFS 순회  (0) 2024.04.06
[프로그래머스 lv2]전화번호 목록.ver2  (0) 2024.04.05
[프로그래머스 lv2]영어 끝말잇기.ver2  (0) 2024.04.05

 

from collections import defaultdict

def solution(graph, start):

    adj_list = defaultdict(list)
    for u, v in graph:
        adj_list[u].append(v)


    def dfs(node, visited, result):
        visited.add(node)
        result.append(node)
        for neighbor in adj_list.get(node, []):
            print('neighbor', neighbor)

            if neighbor not in visited:
                dfs(neighbor, visited, result)

    
    visited=set()
    result = []
    dfs(start, visited, result)

    return result

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

문제설명

 

 

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

 

구조대 : 119

박준영 : 97 674 223

지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book  solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true return 하도록 solution 함수를 작성해주세요.

 

 

제한 사항

 

 

phone_book의 길이는 1 이상 1,000,000 이하입니다.

각 전화번호의 길이는 1 이상 20 이하입니다.

같은 전화번호가 중복해서 들어있지 않습니다.

 

 

입출력 예제

 

 

phone_book       return
["119", "97674223", "1195524421"]   false
["123","456","789"]  true
["12","123","1235","567","88"] false

 

 

 

입출력 예 설명

 

 

입출력 예 #1

앞에서 설명한 예와 같습니다.

 

입출력 예 #2

한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

 

입출력 예 #3

첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

 

 

문제 해결 방법

 

그래서 연속된 두 문자씩 비교함

 

코드 구현

 

 

def solution(phone_book):
    answer = True
    phone_book.sort()

    count=0
    for num in phone_book:
        if count==0:
            count+=1
            pass
        else:
            preNum = phone_book[count-1]
            if preNum in num and num.startswith(preNum):
                answer = False
            count+=1
    
    return answer

 

 

 

시간/공간 복잡도

 

 

O(N)

 

 

최적화 및 개선

 

그래서 연속된 두 문자씩 비교를 위해 문자열 상태에서 sort를 하여 찾는 효율을 높임.

시간 초과 개선을 위해 모든 문자열 비교하려고 하지않음.

특정 문자열이 문자열 접두사로 붙는 것을 확인하기 위해 startswith함수를 사용함.

 

 

어려웠던 점 및 느낀점

 

없음. 확실히 예전에 푼문제라 그런가 이해가 빨리되고, 풀때 헤메는 것도 잠깐이고 코드가 간결해짐.

 

 

 

 

 

 

 

'CodingTest > solved - Python' 카테고리의 다른 글

BFS 순회  (0) 2024.04.08
DFS 순회  (0) 2024.04.06
[프로그래머스 lv2]영어 끝말잇기.ver2  (0) 2024.04.05
[프로그래머스 lv3]길 찾기 게임  (0) 2024.04.04
[프로그래머스 lv3]미로 탈출  (0) 2024.03.20

리스트에 대해 인덱스와 값 쌍 출력하기 위한 방법

  • enumerate()

반복문에 enumerate(리스트명) 사용하면 인덱스와 리스트 값 쌍이 나옴

# 예시

for i, key in enumerate(words):
	print(i, ': ', key)

 

문자열로 이뤄진 리스트나 딕셔너리에서 특정 문자로 시작하는지 확인하기 위한 함수 

  • startswith()
key.startswith(num)

 

리스트에서 특정 원소의 인덱스를 반환해주는 함수 

  • index()
key.index(num)==0

 

인접 리스트

# defaultdict 클래스로 그래프를 인접 리스트로 변환 할 수 있다. 
# defaultdict 클래스는 키가 없을 때 기본값을 defaultdict 형태로 기본값을 지정한다. 

# defaultdict 자료형에서는 append()를 통해 값을 추가할 수 있다. 

  • defaultdict()
  • append() 
from collections import defaultdict

tmp_list = defaultdict(list)

예를들어서, defaultdict(list)라고 코드 작성시 기본값은 []와 같이 초기화 한다.

tmp_list[start].append(end)

 

 

집합

  • set() 집합 생성함수
  • add() 집합에 객체 추가 함수 
  • get() 키값을 통해 value를 조회하는 함수 

 

visited = set()

visited.add(node)

for injeop in node_tree.get(node, []):
# node_tree의 node에 대해 값이 있으면 해당 값의 개수만큼 개수를 출력해준다. injeop으로.
# 만약 값이 없으면, 빈 [] 리스트를 출력해준다.

 

 

우선순위 큐(Heap Queue)

 

파이썬 내장 모듈인  'heapq'는 최소 힙(min heap)자료구조를 제공한다. 

최소 힙은 가장 작은 요소가 항상 루트에 위치해, 최소값을 빠르게 찾을 수 있는 자료구조이다. 

 

  • heappush() 힙큐에 요소를 추가하는 함수
  • heappop() 힙큐에서 가장 작은 요소(루트에 위치한 요소)를 제거하고 반환하는 함

 

import heapq

# 최소 힙 생성
queue = []
heapq.heappush(queue, 5)
heapq.heappush(queue, 3)
heapq.heappush(queue, 8)

# 가장 작은 요소 제거 및 반환
smallest = heapq.heappop(queue)
print(smallest)  # 출력: 3

 

 

딕셔너리

  • items() 딕셔너리의 모든 (키, 값)쌍을 반환하는 함수 

 

'Python' 카테고리의 다른 글

[Python] 컴프리헨션(comprehension)  (0) 2024.04.08
[Python]클래스, 생성자, 상속, 메서드 오버라이딩, 클래스 변수  (0) 2024.04.02
[5주차]9장 이진트리  (0) 2024.03.21
[4주차]8장 해시  (0) 2024.01.30
[3주차]7장 큐  (0) 2024.01.30

https://school.programmers.co.kr/learn/courses/30/lessons/12981?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

 

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

1번부터 번호 순서대로  사람씩 차례대로 단어를 말합니다.

마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.

앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.

이전에 등장했던 단어는 사용할  없습니다.

 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

tank  kick  know  wheel  land  dream  mother  robot  tank

 끝말잇기는 다음과 같이 진행됩니다.

1 사람이 자신의  번째 차례에 tank 말합니다.

2 사람이 자신의  번째 차례에 kick 말합니다.

3 사람이 자신의  번째 차례에 know 말합니다.

1 사람이 자신의  번째 차례에 wheel 말합니다.

(계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3 사람이 자신의  번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의  n 사람들이 순서대로 말한 단어 words  매개변수로 주어질 , 가장 먼저 탈락하는 사람의 번호와  사람이 자신의  번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

제한 사항

끝말잇기에 참여하는 사람의  n 2 이상 10 이하의 자연수입니다.

words 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.

단어의 길이는 2 이상 50 이하입니다.

모든 단어는 알파벳 소문자로만 이루어져 있습니다.

끝말잇기에 사용되는 단어의 (의미) 신경 쓰지 않으셔도 됩니다.

정답은 [ 번호, 차례 ] 형태로 return 해주세요.

만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0] return 해주세요.

문제 해결 방법

문제를 풀기위한 조건들을 하나하나 생각해서 하나하나 제외해가면서 풀었음

 

코드 구현

def solution(n, words):
    answer = []
    # 1번부터 마지막 순서까지 돌고돈다.
    # 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야한다. 
    # 이전에 등장했던 단어는 사용할 수 없다. 
    # 한 글자 단어 인정안해줌
    newWords=[] #스택에 쌓음
    newWords.append(words[0]) 
    
    cnt = 1 #words에서 어디를 가리키는지 
    big_phase=0
    check = 0
    check2 = 0
    while 1:
        big_phase+=1
        for i in range(1, n+1):
            if check ==1:
                answer.append(i)
                answer.append(big_phase)
                return answer
            
            if check2 == 1:
                answer.append(i)
                answer.append(big_phase)
                return answer
            
            if cnt == len(words):
                break
            
            if words[cnt][0] == newWords[-1][-1]:
                pass
            else:
                check = 1
                
            
            if words[cnt] in newWords:
                check2 = 1
            else:
                newWords.append(words[cnt])  
                cnt+=1
                
        if cnt == len(words):
                break

    answer.append(0)
    answer.append(0)
    
    return answer

 

시간/공간 복잡도

O(n)

 

최적화 및 개선

최적화 및 개선하지 않음

 

어려웠던 점

 

예전에 작성한 코드랑 그닥 로직이 다른거 같진 않다.. 

스스로 더 로직을 잘 이해하고 풀었다는 차이점이 존재할뿐? 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/1845

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에,  박사님의 연구실에 도착했습니다.  박사님은 당신에게 자신의 연구실에 있는  N 마리의 폰켓몬 중에서N/2마리를 가져가도 좋다고 했습니다.

 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에  4마리의 폰켓몬이 있고,  폰켓몬의 종류 번호가 [3, 1, 2, 3]이라면 이는 3 폰켓몬  마리, 1 폰켓몬  마리, 2 폰켓몬  마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬  2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

 

 번째(3),  번째(1) 폰켓몬을 선택

 번째(3),  번째(2) 폰켓몬을 선택

 번째(3),  번째(3) 폰켓몬을 선택

 번째(1),  번째(2) 폰켓몬을 선택

 번째(1),  번째(3) 폰켓몬을 선택

 번째(2),  번째(3) 폰켓몬을 선택

 

이때,  번째(3) 폰켓몬과  번째(3) 폰켓몬을 선택하는 방법은  종류(3 폰켓몬  마리) 폰켓몬만 가질  있지만, 다른 방법들은 모두  종류의 폰켓몬을 가질  있습니다. 따라서  예시에서 가질  있는 폰켓몬 종류 수의 최댓값은 2 됩니다.

당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums 매개변수로 주어질 , N/2마리의 폰켓몬을 선택하는 방법 , 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

nums 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.

nums 길이(N) 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.

폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.

가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할  있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.

 

 

 

문제 해결 방법

 

중복제거를 위해 집합을 사용했다. 

 

코드 구현

 

def solution(nums):
    newSet = set(nums)
    num = len(nums)//2
    
    if num < len(newSet):
        answer= num
    else:
        answer = len(newSet)
    
    return answer

 

 

 

 

시간/공간 복잡도

 

 

O(n)

 

 

 

 

최적화 및 개선

 

 

하지않음 

 


어려웠던 점

 

집합을 알고나니 코드 줄이 확 줄었다~ 하핫

def solution(k, operations):
    def find(nodeList, target):
        if nodeList[target] and target != nodeList[target]:
            result = nodeList[target]
            find(nodeList, result)
        return target

    nodeList = []

    for i in range(0, k):
        nodeList.append(i)


    for i in operations:

        if i[0] == 'u':
            if i[1] < i[2]:
                idx = i[1]
                toIdx = i[2]
                nodeList[idx] = nodeList[toIdx]
            else:
                idx = i[2]
                toIdx = i[1]
                nodeList[idx] = nodeList[toIdx]

        elif i[0] == 'f':
            rootNode = find(nodeList, i[1])
            

    cnt = 0
    for i in range(0, len(nodeList)):
        if nodeList[i] == i:
            cnt+=1
    

    return cnt

문제설명

https://school.programmers.co.kr/learn/courses/30/lessons/42892

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

참고 

문제 해결 방법

 

주어진 리스트로 트리 만드는 부분 구현후, 스택을 활용해 트리 순회하는 코드 작성함 

후위 순회는 방문 여부를 체크 하도록 하여 구현하였음


코드 구현

 

 

def solution(nodeinfo):
    answer = []
    original = nodeinfo
    
    cnt = 0
    for i in nodeinfo:
        cnt +=1
        i.append(cnt)
    
    
    nodeinfo.sort(key = lambda x : (-x[1], x[0]))
    

    class Node:
        def __init__(self, key):
            self.left = None
            self.right = None
            self.val = key[2]
            self.x = key[0]
    
    class BST:
        def __init__(self):
            self.root = None
        
        def insert(self, key):
            if not self.root:
                self.root = Node(key)
            else:
                curr = self.root
                while 1:
                    if curr.x > key[0]:
                        if curr.left:
                            curr = curr.left
                        else:
                            curr.left = Node(key)
                            break
                    else:
                        if curr.right:
                            curr = curr.right
                        else:
                            curr.right = Node(key)
                            break
                    
        def preorder(self, result):
            curr = self.root
            stackk=[]
            stackk.append(curr)
            
            while 1:
                if len(stackk) != 0:
                    curr = stackk.pop()
                    
                    if curr is None:
                        continue
                    
                    result.append(curr.val)
                    stackk.append(curr.right)
                    stackk.append(curr.left)
                else:
                    break
            return result
                    
        def postorder(self, result):
            curr = self.root
            stackk=[(self.root, False)]
            # 이코드 대신 위에 코드 stackk.append(curr, False)
            
            while 1:
                if len(stackk) != 0:
                    curr, visited = stackk.pop()
                                      
                    if curr is None:
                        continue
                    if visited:
                        result.append(curr)
                    else:
                        stackk.append((curr.val, True))
                        stackk.append((curr.right, False))
                        stackk.append((curr.left, False))
                else:
                    break
            
            return result
    
    bst = BST()

    for key in nodeinfo:
        bst.insert(key)
        
    
    result = []
    answer.append(bst.preorder(result))
    result = []
    answer.append(bst.postorder(result))
    
    
    return answer

 

 

시간/공간 복잡도

 

O(N^2)


최적화 및 개선

 

하지않음


어려웠던 점

 

트리 구성 까지는 할 수 있는데, 트리 순회할때 재귀함수를 사용하지 않고 스택으로 구현하려니 어려웠다. 

 

자료구조 트리를 공부하면서 이진트리 탐색 구현 부분을 공부하고 있는데, 파이썬에서 클래스의 개념을 한번 짚고 넘어가야할 것 같아서 이 글을 쓰게되었다. 

 

 

클래스가 필요한 이유

클래스를 쓰지 않아도 프로그램을 만들 수 있지만, 클래스를 사용하면 개발자에게 좋은 점이 많다.

 

 

 

만약 하나의 프로그램에서, 간단한 요리를 만드는 프로그램을 만든다고 가정한다. 

 

첫번째 요리를 레시피대로 만드는 함수 1이 있다고 하고, 함수에 들어가는 재료와, 요리 결과물을 담는 결과(그릇)가 있다고 가정한다. 

 

만약 이때, 첫번째 요리를 함과 동시에 두번째 요리로 요리 재료를 조금만 바꿔서 또 다른 요리를 만든다고 했을때, 

 

프로그램에는 함수에 들어가는 또 다른 재료와, 재료가 바뀐 결과물을 담는 결과(그릇)가 하나 더 있어야 하고

 

동시에 요리를 하지만 두번째 결과물(그릇)에 요리를 담아야 하므로 요리를 레시피대로 만드는 함수 2가 더 필요하다. 

 

 

 

만약 이때, 하나의 프로그램에서 10가지 각각 다른 요리를 만들어야 한다면? 

요리에 필요한 함수와 결과(그릇)을 일일이 하나씩 만들어줘야 한다. 그리고 레시피도 조금씩 변경되면 더 복잡해질 것이다. 

 

 

이때 필요한 것이 클래스이다. 

 

 

cooking bowl1 = 0
cooking bowl2 = 0

def recepe1(num):   
    global cooking bowl1
    cooking bowl1 += num
    return cooking bowl1

def recepe2(num):  
    global cooking bowl2
    cooking bowl2 += num
    return cooking bowl2

print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))

 

클래스 사용전


 

class Cooking:
    def __init__(self):
        self.cookingBowl = 0

    def recepe1(self, num):
        self.cookingBowl += num
        cookingBowl self.cookingBowl
    
    # 기능 추가시 해당 위치에 함수 추가

cookingBowl1 = Cooking() # 객체
cookingBowl2 = Cooking()

print(cookingBowl1.recepe1(3))
print(cookingBowl1.recepe1(4))
print(cookingBowl2.recepe1(3))
print(cookingBowl2.recepe1(7))

 

클래스 사용후

 

 

 

클래스 내부 함수를 메서드라고 부른다. 

클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다. 

 

class FourCal:
    def __init__(self, first, second): # 아래의 setdata와 똑같지만, 생성자이므로 객체 생성시 자동으로 호출된다는 차이가 존재함
        self.first = first
        self.second = second
        
    def setdata(self, first, second): # 메서드
        # 파이썬 메서드에서 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 
        # 객체 호출시, 호출한 객체 자신이 전달되므로 self를 사용한다. 
        self.first = first
        self.second = second

    def add(self):
        sum = self.first + self.second
        return sum
    
    def sub(self):
        sum = self.first - self.second
        return sum
    
    def mul(self):
        sum = self.first * self.second
        return sum
    
    def div(self):
        sum = self.first / self.second
        return sum


# 상속
    # FourCal 클래스를 상속하는 MoreFourCal클래스이다. 
    # 기존 클래스를 수정하지 않고 상속을 이용하는 이유는?
    # 기존 클래스가 라이브러리 형태로 제공되거나 수정이 불가한 상황일 때 사용한다. 

class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result
    

class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second

# 부모 클래스에 있는 메서드를 같은 이름으로 다시 만드는 것을
# 메서드 오버라이딩 이라고 한다. 
# 이럴 경우 기존 부모 클래스의 div함수가 아닌 오버라이딩한 메서드가 호출된다. 
        

class Friend:
        lastname = "배" # 클래스 변수: 클래스 안에 변수를 선언하여 생성

classVar = Friend()

name = classVar.lastname
print('name: ',name)

Friend.lastname = "이"
name = classVar.lastname
print('name: ',name)


# 객체 변수와 다르게 클래스 변수는 모든 객체에 공유된다.
# 클래스 변수와 같은 이름의 객체 변수 생성이 가능하다. 

classVar.lastname = "최"
name2 = classVar.lastname
print('name2: ', name2)

print('name: ',name)
# 기존의 classVar 클래스의 lastname과는 상관 없다. 
# 즉, classVar 클래스의 클래스 변수 lastname은 변하지 않았음


#a = FourCal() # 생성자를 만든 후에는 안에 인자를 넣어줘야 값이 전달된다. 

# a.setdata(4, 2) 
    
a = FourCal(4, 2) 

# 객체를 이용해 클래스의 메서드 호출 시 .연산자 사용
# FourCal클래스의 setdata메서드는 인자가 self, first, second로 3개임
# 그런데 왜 객체 a의 메서드 호출시에는 2개의 인자만 사용되어도 문제가 없는걸까?
# 객체 a가 setdata의 self로 자동으로 전달되기 때문이다. 


# 만약 객체 생성시 초기값을 설정 해주지 않고, 객체로 다른 메서드를 호출한다면
# 오류가 발생한다. 

# 이를 방지하기 위해 생성자를 구현해두는 것이 안전하다. 
# 생성자는 객체가 만들어질 때 자동으로 호출되는 메서드를 말한다. 

# 파이썬 메서드 명으로 __init__을 사용하면 해당 메서드는 생성자가 된다.

c = a.add()
print(c)

b = MoreFourCal(4, 2) # 클래스는 상속받은 FourCal 클래스의 모든 기능을 사용할 수 있다. 

d = b.add()
print(d)

 

'Python' 카테고리의 다른 글

[Python] 컴프리헨션(comprehension)  (0) 2024.04.08
[Python]각종 함수  (0) 2024.04.05
[5주차]9장 이진트리  (0) 2024.03.21
[4주차]8장 해시  (0) 2024.01.30
[3주차]7장 큐  (0) 2024.01.30

 

Go 언어를 통해 웹 서버 만들기

 

Go 언어에서는 net/http 패키지를 통해 웹 서버를 쉽게 만들 수 있다.

 

웹 서버를 만들기 전에 각 경로에 대한 핸들러를 등록한 후 시작해야 한다. 

해당 과정을 통해 핸들러를 등록 한 후, 웹 브라우저에서 경로를 입력하면 HTTP 요청을 서버로 전송할 수 있다. 

 

웹 서버 테스트 코드는 httptest패키지를 사용해 작성할 수 있다. 

 

HTTP를 사용하면 HTML 및 다양한 데이터를 전송할 수 있다. 

데이터 전송시 JSON 포맷을 많이 사용한다. 

 

 

RESTful API 서버 만들기

 

REST란 여러가지의 웹 아키텍처를 합친 개념을 말한다. 

 

RESTful API를 만들기 위해서 URL로 자기표현식 데이터를 나타낼 수 있다. 

 

데이터 동작을 정의하기 위해 HTTP 메서드를 이용해야 한다. 

 

어떤 서비스라도 일관된 표현식으로 표현하기 위해서는 REST를 사용하면 된다. 

 

RESTful API를 이용하면, 데이터 규약이 통일되고, 이를 통해 많은 서비스 간 연결이 가능하다. 

 

 

 

통상적으로 프론트엔드, 백엔드, 데이터베이스 3계층으로 구성된 것을 웹 서비스라고 하며, 3티어 라고 한다. 

 

  • 프론트엔드
    • 사용자가 화면을 볼 때, 보이는 부분이고 HTML, CSS, JavaScript로 만들어진다.
  • 벡엔드
    • 사용자가 화면을 보기 위해 사용자가 보이지 않는 곳에서 화면 구성에 필요한 데이터와 동작 로직을 제공하는 계층이다. Go를 사용하면 쉽게 만들 수 있다. 
  • 데이터베이스
    • 데이터베이스 종류는 다양하며, 데이터를 저장하는 계층이다. 

 

총체적으로 Go는 백엔드에 특화된 프로그래밍 언어이다. 

 

웹 서버를 테스트용으로 배포할 때 헤로쿠를 사용할 수 있다. 헤로쿠는 무료이며, PaaS 서비스를 제공한다. 

 

 

 

 

 

 

 

해당 글은 [Tucker의 Go 언어 프로그래밍] 29장~31장을 읽고 공부한 글입니다

+ Recent posts