문제 설명


문제


문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.

각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.


입력


첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.


출력


첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.


풀이 과정


  1. 문자열을 입력받을 때, 얼마나 입력받을지 정해지지 않은 경우 쓰여지는 방법

     try:
         string = input()
         ...
     except EOFError:
         break
  2. 위 방법으로 문자열을 입력받은 뒤, 문자 하나씩 소문자인지, 대문자인지, 숫자인지, 공백인지 검사하고 개수를 늘리면 된다.


소스 코드


import sys
N = 0

for i in range(100):
    try:
        string = input()
        lower, upper, digit, blank = 0, 0, 0, 0
        for char in string:
            if char == " ":
                blank += 1
            if char.isupper():
                upper += 1
            if char.islower():
                lower += 1
            if char.isdigit():
                digit += 1

        print("%d %d %d %d"%(lower, upper, digit, blank))
    except EOFError:
        break

문제 설명


문제


페르마의 마지막 정리는, a, b, c가 0이 아닌 정수이고, n이 2보다 큰 자연수 일 때, an= bn+ cn을 만족하는 자연수 a, b, c가 존재하지 않는다는 정리이다. 이 정리는 아직 증명되지 않았다.

하지만, 완전 세제곱 방정식 a3= b3+ c3+ d3을 만족하는 1보다 큰 자연수를 찾는 것은 어렵지 않다. (123= 63+ 83+ 103)

이러한 완전 세제곱 방정식과 a ≤ 100을 만족하는 {a, b, c, d}쌍을 모두 찾는 프로그램을 작성하시오.


입력


이 문제는 입력이 없다.


출력


a값이 증가하는 순서대로 아래 출력 형식과 같이 출력한다. b, c, d도 증가하는 순서로 이루어져야 한다. a값에 해당하는 b, c, d쌍이 여러 개 존재할 수 있다. 이때는 b 값이 작은 것부터 먼저 출력한다.

아래 출력 예제는 일부분만 나와있다.


풀이 과정


  • a, b, c, d를 모두 전수조사
    • a, b, c, d를 2~100까지 늘려가면서 b의 3제곱 + c의 3제곱 + d의 3제곱이 a의 3제곱인지 검사한다.
    • 이 때, a, b, c, d를 크기순으로 출력해주어야 하므로 반복문을 a부터 d 순서로 진행한다.
    • 중복된 요소를 출력하지 않기 위해 b의 반복 범위를 2100라 할 때, c는 b+1100, d는 c+1~100으로 진행한다.

소스 코드


for l in range(2, 101):
    for i in range(2, l):
        for j in range(i+1, l):
            for k in range(j+1, l):
                temp = i ** 3 + j ** 3 + k ** 3
                if l ** 3 == temp:
                    print("Cube = %d, Triple = (%d,%d,%d)"%(l,i,j,k))

풀이 과정


문제

다솜이는 유료 고속도로를 가지고 있다. 다솜이는 현재 고속도로에 휴게소를 N개 가지고 있는데, 휴게소의 위치는 고속도로의 시작으로부터 얼만큼 떨어져 있는지로 주어진다. 다솜이는 지금 휴게소를 M개 더 세우려고 한다.

다솜이는 이미 휴게소가 있는 곳에 휴게소를 또 세울 수 없고, 고속도로의 끝에도 휴게소를 세울 수 없다. 휴게소는 정수 위치에만 세울 수 있다.

다솜이는 이 고속도로를 이용할 때, 모든 휴게소를 방문한다. 다솜이는 휴게소를 M개 더 지어서 휴게소가 없는 구간의 길이의 최댓값을 최소로 하려고 한다. (반드시 M개를 모두 지어야 한다.)

예를 들어, 고속도로의 길이가 1000이고, 현재 휴게소가 {200, 701, 800}에 있고, 휴게소를 1개 더 세우려고 한다고 해보자.

일단, 지금 이 고속도로를 타고 달릴 때, 휴게소가 없는 구간의 최댓값은 200~701구간인 501이다. 하지만, 새로운 휴게소를 451구간에 짓게 되면, 최대가 251이 되어서 최소가 된다.

입력

첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. N은 100보다 작거나 같으며, M도 100보다 작거나 같다. L은 100보다 크거나 같고, 1000보다 작거나 같은 정수이다. 모든 휴게소의 위치는 중복되지 않으며, N+M은 L보다 작다. 둘째 줄에, 휴게소의 위치가 공백을 사이에 두고 주어진다.

출력

첫째 줄에 M개의 휴게소를 짓고 난 후에 휴게소가 없는 구간의 최댓값의 최솟값을 출력한다.


풀이 과정


  1. 이분 탐색으로 정답을 찾는다.
    • 현재 휴게소 위치를 오름차순으로 정렬
    • 이분 탐색으로 구할 값을 휴게소의 구간 최댓값이라고 하고, 시작점을 0, 끝점을 L로 두고 중간값일 때, 휴게소가 몇개 세워질 수 있는지 구한다.
    • 휴게소의 개수를 구할 때, 이미 휴게소가 있는 곳에 휴게소를 또 세울수 없으므로 나누어 떨어지는 경우에는 -1을 해준다.
    • 현재 구간에서 세워야 하는 휴게소의 개수 => ((휴게소[i] - 휴게소[i-1]) // 구간 최댓값)
    • 세워야 하는 휴게소의 개수를 넘기는 경우에는 시작점을 중간값+1로 조정하고, 휴게소의 개수보다 작다면 정답을 저장해둔 뒤, 끝점을 중간값-1로 조정한다.
  2. 정답을 출력한다.
  • 이분 탐색을 진행할 때, 시뮬레이션을 어떻게 할지를 많이 고민해보아야 할 것 같음.

소스 코드


import sys

input = sys.stdin.readline
N, M, L = map(int, input().rstrip().split())
stations = list(map(int, input().rstrip().split()))
stations = [0] + stations + [L]
stations.sort()

left = 0
right = L
answer = 0
while left <= right:
    mid = (left + right) // 2

    # simulate
    add_count = 0
    for i in range(1, len(stations)):
        dist = stations[i] - stations[i-1]
        if dist > mid:
            add_count += (dist // mid)
            if dist % mid == 0:
                add_count -= 1
    if add_count > M:
        left = mid + 1
    else:
        answer = mid
        right = mid - 1

print(answer)

문제 설명


문제


현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로 하였다. 현우는 통장에서 K원을 인출하며, 통장에서 뺀 돈으로 하루를 보낼 수 있으면 그대로 사용하고, 모자라게 되면 남은 금액은 통장에 집어넣고 다시 K원을 인출한다. 다만 현우는 M이라는 숫자를 좋아하기 때문에, 정확히 M번을 맞추기 위해서 남은 금액이 그날 사용할 금액보다 많더라도 남은 금액은 통장에 집어넣고 다시 K원을 인출할 수 있다. 현우는 돈을 아끼기 위해 인출 금액 K를 최소화하기로 하였다. 현우가 필요한 최소 금액 K를 계산하는 프로그램을 작성하시오.


입력


1번째 줄에는 N과 M이 공백으로 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ N)

2번째 줄부터 총 N개의 줄에는 현우가 i번째 날에 이용할 금액이 주어진다. (1 ≤ 금액 ≤ 10000)


출력


첫 번째 줄에 현우가 통장에서 인출해야 할 최소 금액 K를 출력한다.


풀이 과정


  1. 인출할 금액 K의 최소 금액을 N일동안 사용할 금액 중 최댓값으로 하고, 최대 금액을 10000 * 100000으로 하여 이분탐색 진행
    • 이유는, 적어도 한번에 인출한 금액이 매일매일 사용하는 금액보다는 커야 하기 때문이다.
    • 또한, 최대 금액같은 경우는 매일매일 10000원씩 10만일(N) 사용하는데, 인출을 한번만 하는 경우에는 10000 * 100000원 인출하여야 하기 때문이다.
  2. 이분탐색 진행 시 중간값으로 시뮬레이션 한다.
    • 중간값 기준으로 M번 이하 인출하는지 확인하고, 그렇다면 정답에 저장해두고 왼쪽 구간 진행
    • M번 이상 인출한다면, 오른쪽 구간 진행
  3. 저장해둔 정답을 출력하면 된다.

소스 코드


import sys

input = sys.stdin.readline
N, M = map(int, input().rstrip().split())
moneys = [int(input().rstrip()) for _ in range(N)]
mx_moneys = max(moneys)

left = mx_moneys
right = 10000 * 100000

answer = 0
while left <= right:
    mid = (left + right) // 2
    days = 1
    p = mid
    for money in moneys:
        if p - money < 0:
            p = mid
            days += 1
        p = p - money

    if days <= M:
        answer = mid
        right = mid-1
    else:
        left = mid+1

print(answer)

문제 설명


문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.


풀이 과정

  1. 피연산자 각각을 딕셔너리 형태로 만들어서 입력받은 값을 대입시킨다.

    • {'A' : 1, 'B' : 2, ... }
  2. 일반적인 후위표현식을 푸는 방식

    • 피연산자가 나타나면, 스택에 집어넣는다.
    • 연산자를 만나게 되면, 스택에서 두개의 피연산자를 pop한 후, 연산을 수행한 다음 결괏값을 다시 스택에 집어넣는다.

import sys
from collections import deque

input = sys.stdin.readline
N = int(input().rstrip())
v = list(input().rstrip())

queue = deque()
val_dict = dict()

for i in range(N):
    val_dict[chr(ord('A')+i)] = int(input().rstrip())

for char in v:
    if char in ['*', '+', '/', '-']:
        p1 = queue.pop()
        p2 = queue.pop()
        result = eval(str(p2) + char + str(p1))
        queue.append(result)
    else:
        queue.append(val_dict[char])

print("%.2f"%(queue.popleft()))

문제 설명


문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.


풀이 과정

  1. Union-find 알고리즘 활용하여 각각의 정점이 속하는 집합을 구해준다.
    • Parent 배열에 각각의 정점의 부모노드 저장
  2. 집합의 개수를 출력해주면 된다.

소스 코드

import sys

N, M = map(int, sys.stdin.readline().rstrip().split())

parent = [i for i in range(N+1)]
def union(a, b):
    p1 = find(a)
    p2 = find(b)
    if p1 != p2:
        parent[p1] = p2

def find(a):
    if parent[a] != a:
        parent[a] = find(parent[a])

    return parent[a]

for _ in range(M):
    a, b = map(int, sys.stdin.readline().rstrip().split())
    if find(a) != find(b):
        union(a, b)

for i in range(1, N+1):
    find(i)

s = set(filter(lambda x:x>0, parent))
print(len(s))    

문제 설명


문제

석환이는 아기다. 아기 석환이는 자연수가 쓰여져있는 카드를 갖고 다양한 놀이를 하며 노는 것을 좋아한다. 오늘 아기 석환이는 무슨 놀이를 하고 있을까? 바로 카드 합체 놀이이다!

아기 석환이는 자연수가 쓰여진 카드를 n장 갖고 있다. 처음에 i번 카드엔 ai가 쓰여있다. 카드 합체 놀이는 이 카드들을 합체하며 노는 놀이이다. 카드 합체는 다음과 같은 과정으로 이루어진다.

  1. x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)
  2. 계산한 값을 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.

이 카드 합체를 총 m번 하면 놀이가 끝난다. m번의 합체를 모두 끝낸 뒤, n장의 카드에 쓰여있는 수를 모두 더한 값이 이 놀이의 점수가 된다. 이 점수를 가장 작게 만드는 것이 놀이의 목표이다.

아기 석환이는 수학을 좋아하긴 하지만, 아직 아기이기 때문에 점수를 얼마나 작게 만들 수 있는지를 알 수는 없었다(어른 석환이는 당연히 쉽게 알 수 있다). 그래서 문제 해결 능력이 뛰어난 여러분에게 도움을 요청했다. 만들 수 있는 가장 작은 점수를 계산하는 프로그램을 만들어보자.

입력

첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다.

두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1, a2, …, an이 공백으로 구분되어 주어진다. (1 ≤ ai≤ 1,000,000)

출력

첫 번째 줄에 만들 수 있는 가장 작은 점수를 출력한다.


풀이 과정

  1. 매 순간 가장 작은 카드 두개를 뽑아서 더한 값을 가진 카드 두장을 다시 넣어주어야 한다.
    • 이 때, 가장 작은 카드 두개를 뽑아야 하므로 최소 히프를 사용하였다.
  2. 즉, 최소 히프에서 두개를 뽑아서 더한다음, 더한 값을 두번 넣어주면 된다.

소스 코드

import sys
import heapq

n, m = map(int, sys.stdin.readline().rstrip().split())
cards = list(map(int, sys.stdin.readline().rstrip().split()))
heap = []

for card in cards:
    heapq.heappush(heap, card)

for _ in range(m):
    a = heapq.heappop(heap)
    b = heapq.heappop(heap)
    heapq.heappush(heap, a+b)
    heapq.heappush(heap, a+b)

print(sum(heap))

문제 설명


문제

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다!

젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입은 주인공이고 젤다는 그냥 잡혀있는 공주인데, 게임 타이틀에 젤다가 나와있다고 자꾸 사람들이 이렇게 착각하니까 정신병에 걸릴 위기에 놓인 것이다.

하여튼 젤다...아니 링크는 이 동굴의 반대편 출구, 제일 오른쪽 아래 칸인 [N-1][N-1]까지 이동해야 한다. 동굴의 각 칸마다 도둑루피가 있는데, 이 칸을 지나면 해당 도둑루피의 크기만큼 소지금을 잃게 된다. 링크는 잃는 금액을 최소로 하여 동굴 건너편까지 이동해야 하며, 한 번에 상하좌우 인접한 곳으로 1칸씩 이동할 수 있다.

링크가 잃을 수밖에 없는 최소 금액은 얼마일까?

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스의 첫째 줄에는 동굴의 크기를 나타내는 정수 N이 주어진다. (2 ≤ N ≤ 125) N = 0인 입력이 주어지면 전체 입력이 종료된다.

이어서 N개의 줄에 걸쳐 동굴의 각 칸에 있는 도둑루피의 크기가 공백으로 구분되어 차례대로 주어진다. 도둑루피의 크기가 k면 이 칸을 지나면 k루피를 잃는다는 뜻이다. 여기서 주어지는 모든 정수는 0 이상 9 이하인 한 자리 수다.

출력

각 테스트 케이스마다 한 줄에 걸쳐 정답을 형식에 맞춰서 출력한다. 형식은 예제 출력을 참고하시오.


풀이 과정

  1. 기존 다익스트라 알고리즘과는 다르게 distance를 2차원 배열로 해서 구현했던게 특이
    • 현재 좌표 기준으로 상,하,좌,우 이동하면서 거리 갱신 및 최소 히프에 이동하는 좌표 저장
    • 시작점은 [0, 0]이고, 매 순간 배열 범위를 벗어나는지 확인하는 과정 필요
  2. 다익스트라 알고리즘이 종료되는 순간, distance[n-1][n-1]을 출력해주면 된다.
    • print('%d'%(변수)) 문법 사용

소스 코드

import sys
import heapq

problem_count = 1
input = sys.stdin.readline
while True:
    n = int(input().rstrip())
    if n == 0:
        break
    matrix = [list(map(int, input().rstrip().split())) for _ in range(n)]
    INT_MAX = int(10e9)
    distance =[[INT_MAX] * n for _ in range(n)]
    heap = []
    distance[0][0] = matrix[0][0]
    heapq.heappush(heap, [matrix[0][0], [0, 0]])
    dx = [-1, 1, 0, 0]
    dy = [0, 0, 1, -1]
    while heap:
        dist, pos = heapq.heappop(heap)
        if distance[pos[0]][pos[1]] < dist:
            continue
        for i in range(4):
            nx = pos[0] + dx[i]
            ny = pos[1] + dy[i]
            if 0 <= nx and nx < n and 0 <= ny and ny < n:
                if distance[nx][ny] > dist + matrix[nx][ny]:
                    distance[nx][ny] = dist + matrix[nx][ny]
                    heapq.heappush(heap, [dist + matrix[nx][ny], [nx, ny]])
    print("Problem %d: %d"%(problem_count, distance[n-1][n-1]))
    problem_count += 1

문제 설명


문제

N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다.

입력

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.

그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.


풀이 과정

  1. 각각의 연결 정보를 토대로 그래프 구성
  2. Dijkstra 알고리즘을 활용한다.
    • 거리가 최소인 정점을 뽑아서 연결된 정점들의 거리를 갱신하는 방식
    • 최소 히프를 사용해서 매 순간 거리가 최소인 정점을 빠르게 뽑도록 한다.
  3. 저장된 Distance[B]를 출력해주면 된다.

소스 코드

import sys
import heapq

input = sys.stdin.readline

N = int(input().rstrip())
M = int(input().rstrip())
graph = [[] for _ in range(N+1)]

for _ in range(M):
    fr, to, cost = map(int, input().rstrip().split())
    graph[fr].append([cost, to])

A, B = map(int, input().rstrip().split())

INT_MAX = int(10e9)
heap = [[0, A]]
distance = [INT_MAX] * (N+1)
distance[A] = 0

while heap:
    cost, target = heapq.heappop(heap)
    if distance[target] < cost:
        continue
    for n_cost, n_node in graph[target]:
        if distance[n_node] > cost + n_cost:
            distance[n_node] = cost + n_cost
            heapq.heappush(heap, [cost + n_cost, n_node])

print(distance[B])

async/await


async function fetchAndPrint() {
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    const result = await response.text();
    console.log(result);
}
  • async
    • 함수 안에 비동기적으로 실행되는 부분이 있다(await)
  • await
    • 뒤에 코드를 실행하고 프로미스 객체가 fulfilled/rejected 될때까지 기다림, fulfilled가 되면 작업 실행 결과 리턴
    • async 안에서만 사용 가능함.
async function fetchAndPrint() {
    console.log(2);
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    // fetch 완료될때까지 4는 실행되지 않음. 함수 밖의 나머지 코드들 실행
    console.log(4);
    const result = await response.text();
    console.log(result);
}

console.log(1);
fetchAndPrint();
console.log(3); // await 만나면 3부터 실행
  • await이 있으면 보이는대로 실행되는것이 아님!!
  • await을 만나게 되면 실행 순서를 함수의 다음 코드로
  • 기존 promise 구문을 깔끔하게 작성할 수 있음.

rejected 상태가 된다면


async function fetchAndPrint() {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/users');
        const result = await response.text();
        console.log(result);
    } catch (error) {
        // rejected 상태가 생기면 catch문으로 코드의 실행 흐름 넘어옴
        // error 파라메터에 작업 실패 정보
    } finally {
        // 잘 성공하든 실패하든 무조건 실행
    }
}

fetchAndPrint();
  • try .. catch문을 사용하면 된다.

async


  • async가 붙은 함수는 항상 Promise 객체를 리턴한다.
  • promise 객체가 리턴되면 해당 객체와 동일한 상태와 작업 성공 결과 / 실패 정보
    가진 프로미스 객체 그대로 리턴
  • promise 객체가 아닌 숫자나 문자열, 일반 객체 등을 리턴하는 경우
    • fulfill 상태이면서, 리턴값을 작업 성공 결과로 가진 Promise 객체 리턴
    • undefined인 경우도 fulfill 상태이면서, 작업 성공 결과가 undefined인 promise 객체
    • 에러 발생시 rejected 상태이면서 에러 객체를 작업 실패 정보로 가진 promise 객체 리턴
async function f() {
    return 3;
} // 숫자 3을 작업 성공 결과로 가진 fulfill 상태의 promise 객체 리턴

async function f() {
    return fetch('https://jsonplaceholder.typicode.com/users')
        .then((response) => response.text());
} 
/*promise 객체가 리턴되면 해당 객체와 동일한 상태와 작업 성공 결과 / 실패 정보 
가진 프로미스 객체 그대로 리턴*/

async 안의 async 함수


  • async 함수는 promise 객체를 리턴
  • 다른 async 함수에서 await 키워드를 붙여서 사용할 수 있다.

async 위치


async function f() { }

const f = async function() { }
const f = async (a) => {}
const f = async (a) => a;

( function f() {
    console.log('test')
}()); // 즉시 실행 함수

(async function f() {
    console.log('test')
}());

async 함수 작성시 성능


  • 요청 하나씩 보내고 기다리는 케이스
    • 순서가 중요한 경우
for (const url of urls) {
    const response = await fetch(url);
    console.log(await response.text());
}
  • 일단 모든 요청을 다 보내고 기다리는 케이스
    • 순서같은게 중요하지 않은 경우
for (const url of urls) {
    (async () => {
        const response = await fetch(url);
        console.log(await response.text());
    })();
}
  • 콜백이 여러번 실행되는 경우는 promisify 불가능
  • async/await은 함수 내가 아닌 코드의 최상위 영역에서는 사용 불가능 (then 메서드 써야함.)
  • 콜백에는 동기 실행과 비동기 실행 모두 존재한다.

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 오늘 날짜 가져오기  (0) 2021.08.29
[ JavaScript ] Promise  (0) 2021.08.03
[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30

+ Recent posts