반응형

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.


풀이

in을 사용해서 풀었을 때 시간 초과가 나와서 검색 후 이진 탐색을 통해 문제를 풀었다

틀린python코드

# 10815 숫자 카드
import sys

N = int(sys.stdin.readline())
mycard = list(map(int,sys.stdin.readline().split()))
M = int(sys.stdin.readline())
card = list(map(int,sys.stdin.readline().split()))
mycard.sort()
visited = [0] * M

for i in range(M):
    if card[i] in mycard:
        visited[i] = 1

print(*visited)

답은 쉽게 나오지만 시간 초과,,,

맞은python코드

# 10815 숫자 카드
import sys

N = int(sys.stdin.readline())
mycard = list(map(int,sys.stdin.readline().split()))
M = int(sys.stdin.readline())
card = list(map(int,sys.stdin.readline().split()))
mycard.sort()
# 출력할 배열
visited = [0] * M

for i in range(M):
    start = 0
    end = N - 1
    # print(visited)
    # start의 값이 end 와 같거나 작은 동안 실행
    # start가 end 보다 커지면 반복문 실행 중지
    while start <= end:
        mid = (start + end) // 2
        if card[i] == mycard[mid]:
            visited[i] = 1
            break
        # 값이 작은 경우 처음 부터 mid 앞숫자까지 탐색하므로 mid -1 해준다
        # [0 0 0 mid 0 0 0]
        elif card[i] < mycard[mid]:
            end = mid - 1
        else:
            start = mid + 1
print(*visited)

C++ 코드

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
	int N;
	cin >> N;
	vector<int>mycard(N,0);
	for (int i = 0; i < N; i++) {
		cin >> mycard[i];
	}
	int M;
	cin >> M;
	vector<int>card(M,0);
	for (int i = 0; i < M; i++) {
		cin >> card[i];
	}
	vector<int>visited(M,0);

	sort(mycard.begin(), mycard.end());

	for (int i = 0; i < M; i++) {
		int start = 0;
		int end = N-1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (card[i] == mycard[mid]) {
				visited[i] = 1;
				break;
			}
			else if (card[i] < mycard[mid]) {
				end = mid - 1;
			}
			else {
				start = mid + 1;
			}
		}

	}
	for (int i = 0; i < M; i++) {
		cout << visited[i] << ' ';
	}
}

C++ 너무 오랜만이라 작성하면서 vector나 sort 쓰는걸 다 잊어가지구,,, python 코드 그대로 보면서 검색해가면서 작성해본 코드

반응형
반응형

https://www.acmicpc.net/problem/1476

 

1476번: 날짜 계산

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타

www.acmicpc.net

문제

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.

지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)

우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.

예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다. 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.

E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.

출력

첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.


풀이

당연히 시간초과가 나오지 않을까 싶을 정도로 정직하게 부르트포스로 풀었다

e, s, m에 반복문으로 계속 1씩 더해주고 범위를 넘기면 1부터 다시 1씩 더해준 다음 입력된 값과 같아질 때 카운트를 출력하도록 하였다.

코드

# 1476 날짜 계산

# 입력받음
E,S,M = map(int,input().split())
# 더해질 함수 초기화
e = s = m = 0
# 값
cnt = 0

# 계속 반복
while True:
    e += 1
    # 15 넘어가면 1로 돌아옴
    if e > 15:
        e = 1
    s += 1
    # 28 넘어가면 1로 돌아옴
    if s > 28:
        s = 1
    m += 1
    # 19 넘어가면 1로 돌아옴
    if m > 19:
        m = 1
    cnt += 1
    # 입력값과 같을 때 반복문 탈출
    if e == E and s == S and m == M:
        break

print(cnt)
반응형
반응형

https://www.acmicpc.net/problem/10974

 

10974번: 모든 순열

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다. 

출력

첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.


 

풀이

부르트보스로 풀이를 하고자 하였다.

틀린코드

다음과 같이 풀면 (내가 사용한 테스트케이스 내에서) 모든 순열이 출력이 되지만 사전순으로 출력이 되지 않아서 고생하다가 다른 사람의 풀이를 참고하여 풀었다

f arr(n):
    global ans
    if n == N:
        print(*visited)
    else:
        for i in range(N):
            if visited[i] == 0:
                visited[i] = n+1
                arr(n+1)
                visited[i] = 0

N = int(input())
visited = [0] * N
ans = []
arr(0)

맞은코드

def arr(depth):
    global ans

    if depth == n:
        print(*visited)
    else:
        for i in range(n):
            if i + 1 in visited:
                continue
            visited[depth] = i + 1
            arr(depth + 1)
            visited[depth] = 0
n = int(input())
visited = [0] * n
arr(0)

0일때가 아닌 존재하지 않을때, 그리고 index값을 depth 값으로 받아와야했다

반응형
반응형

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.


풀이

가장 작은 값을 가지기 위해서는 가장 큰 값을 빼야하기 때문에 +를 묶어서 한번에 -해준다.

정수로 변환하기 위해 try except문을 사용하였다

코드

# 1541 잃어버린 괄호

# '-'를 기준으로 나누어 입력받는다
num = list(map(str,input().split('-')))
# print(num)

# 최종적으로 빼지는 수들이 들어올 리스트
arr = []

for i in range(len(num)):
# 만약 list 안에 수가 정수로 변환이 가능하다면 arr 리스트로 들어오고
# +를 포함한 문자라 변환이 되지 않을 경우 except로 이동한다
    try:
        arr.append(int(num[i]))
    except:
        add_ans = 0
        add = []
        add += num[i].split('+')
# +를 기점으로 수를 더해준다
        for j in add:
            add_ans += int(j)
            # print(j)
# 더해진 수를 arr 리스트로 보낸다
        arr.append(int(add_ans))

# 최종적으로 arr 리스트에 있는 수들을 모두 빼준다.
ans = arr[0]
for i in range(1,len(arr)):
    ans -= arr[i]
print(ans)

 

반응형

'study > 백준' 카테고리의 다른 글

[백준] 1476. 날짜 계산  (0) 2022.06.18
[백준] 10974. 모든 순열 : python  (0) 2022.06.15
[백준] 11399. ATM : python  (0) 2022.06.12
[백준] 17478. 재귀함수가 뭔가요? : python  (0) 2022.06.10
[백준] 9655. 돌 게임 : C++  (0) 2022.03.16
반응형

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

문제

인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다.

사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.

줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.

줄을 서 있는 사람의 수 N과 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어졌을 때, 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

출력

첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.


풀이

오름차순 정렬 후 계산한다

코드

# 11399 ATM

n = int(input())
arr = list(map(int,input().split()))

ans = 0
# 배열을 오름차순으로 정렬한 후 더하주면 최소값이 나온다
arr.sort()
# 개인이 기다리는 시간을 저장할 임시변수 temp
temp = 0

# 앞에서부터 대기 시간을 temp에 더한 후 ans에 temp값을 더한다
for i in arr:
    temp += i
    ans += temp

print(ans)
반응형
반응형

https://www.acmicpc.net/problem/17478

 

17478번: 재귀함수가 뭔가요?

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다. 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대

www.acmicpc.net

문제

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다.

매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대학교가 자신과 맞는가에 대한 고민을 항상 해왔다.

중앙대학교와 자신의 길이 맞지 않다고 생각한 JH 교수님은 결국 중앙대학교를 떠나기로 결정하였다.

떠나기 전까지도 제자들을 생각하셨던 JH 교수님은 재귀함수가 무엇인지 물어보는 학생들을 위한 작은 선물로 자동 응답 챗봇을 준비하기로 했다.

JH 교수님이 만들 챗봇의 응답을 출력하는 프로그램을 만들어보자.

입력

교수님이 출력을 원하는 재귀 횟수 N(1 ≤ N ≤ 50)이 주어진다.

출력

출력 예시를 보고 재귀 횟수에 따른 챗봇의 응답을 출력한다.


풀이

재귀를 풀 수 있는가 하는 문제

'____'를 for를 사용해서 작성하니 코드가 엄청 길어졌다

'____'반복을 위해 line수를 재귀할 때 함께 넘겨주도록 하였다

코드

#17478 재귀함수가 뭔가요?

def recursive(m,line):
    if m == 0:
        for i in range(line):
            print('____', end="")
        print('\"재귀함수가 뭔가요?\"')
        for i in range(line):
            print('____', end="")
        print('\"재귀함수는 자기 자신을 호출하는 함수라네\"')
        for i in range(line):
            print('____', end="")
        print('라고 답변하였지.')
        return
    for i in range(line):
        print('____',end="")
    print('\"재귀함수가 뭔가요?\"')
    for i in range(line):
        print('____',end="")
    print('\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
    for i in range(line):
        print('____',end="")
    print('마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
    for i in range(line):
        print('____',end="")
    print('그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"')

    recursive(m - 1,line + 1)

    for i in range(line):
        print('____',end="")
    print('라고 답변하였지.')

n = int(input())
print('어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.')
recursive(n,0)
반응형
반응형

UDP(User Datagram Protocol)

컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약의 일종

 

- 기본적인 것은 TCP와 동일하지만 TCP보다 신뢰성이 없다.

- 받는 쪽에서 데이터를 제대로 받는지 신경쓰지 않는다

- ip주소와 prot 번호를 알면 데이터 전송이 가능하다

 

server코드

# UDPServerSocket.py

import socket

if __name__ == '__main__':
    host = '127.0.0.1'
    port = 4455
	
    # 소켓 생성 
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	# 바인딩
    server.bind((host, port))
	
    
    while True:
        data, addr = server.recvfrom(1024)
        data = data.decode("utf-8")

        print(f"Client : {data}")

        data = data.encode("utf-8")
        server.sendto(data, addr)

 

client코드

# UDPClientSocket.py

import socket

if __name__ == '__main__':
    host = '127.0.0.1'
    port = 4455
    # address의 약자
    addr = (host, port)

	# 소켓 생성
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    while True:
        data = input("Enter a word : ")

        data = data.encode("utf-8")
        client.sendto(data, addr)

        data, addr = client.recvfrom(1024)
        data = data.decode("utf-8")
        print(f"Server:{data}")

server 실행 후 client를 실행한다

# 서버 열기
python UDPServerSocket.py

# 클라이언트 열기
python UDPClientSocket.py

텍스트가 보내지는지 간단하게 확인할 수 있다

반응형
반응형

DFS(깊이우선탐색)와 BFS(너비우선탐색)

DFS(깊이우선탐색)

Depth First Search로 깊이를 우선으로 탐색한다.

 

- 최대한 내려간 후 더이상 탐색할 노드가 없는 경우 다시 돌아와 옆 노드 탐색

 

BFS(너비우선탐색)

Breadth First Search로 너비를 우선으로 탐색한다.

 

- 깊이가 1인 모든 노드 방문 후 다음 ㅍ깊이의 모든 노드 방문

 

 

백준 1260번 DFS와 BFS 파이썬 코드

def DFS(v):
    global visited
    visited[v] = 1
    print(v, end=' ')
    for i in range(len(arr[v])):
        if arr[v][i] == 1:
            if visited[i] == 0:
                DFS(i)

def BFS(v):
    global visited
    Q = [v]
    visited[v] = 1
    while Q:
        v = Q.pop(0)
        print(v, end=' ')
        for i in range(1, N+1):
            if visited[i] == 0 and arr[v][i] == 1:
                Q.append(i)
                visited[i] = 1

N, M, V = map(int,input().split())
arr = [[0]*(N+1) for _ in range(N+1)]
visited = [0]*(N+1)

for num in range(M):
    st, ed = map(int, input().split())
    arr[st][ed] = 1
    arr[ed][st] = 1
DFS(V)
print()
visited = [0]*(N+1)
BFS(V)
반응형
반응형

https://www.acmicpc.net/problem/1427

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.


 

C++ 풀이

받고있는 숫자의 중간에 공백이 없어서 이 숫자를 어떻게 배열로 정렬을하지...? 하다가

str형으로 문자정렬을 한 후 출력하는 방향으로 진행하였다

C++ 코드

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string num;
	int n;
	cin >> n;
	num = to_string(n);
    // 변환 되었는지 확인해보기
	// cout << num;
	
    // 문자열의 길이만큼 반복하며 수를 정렬
	for (int i = 0; i < num.length();i++)
	{	
		int temp;
		for (int j = i+1; j < num.length();j++)
		{
			if (num[i] < num[j])
			{
				temp = num[i];
				num[i] = num[j];
				num[j] = temp;
			}
		}
	}
	for (int i = 0; i < num.length(); i++)
	{
		cout << num[i];
	}
}

python 풀이

python 코드 역시 문자열로 입력받았다

*num으로 바로 출력하려고 했으나 '4 3 2 1' 이런 식으로 공백이 생겨서 for문을 통해 출력했다

python 코드

# 1427 소트인사이드

num = list(input())

for i in range(len(num)):
    for j in range(i,len(num)):
        if num[i] < num[j]:
            num[i], num[j] = num[j], num[i]

# print(*num)
for i in range(len(num)):
    print(num[i],end='')

 

반응형

'study > 백준' 카테고리의 다른 글

[백준] 2750. 수 정렬하기 : C++  (0) 2022.02.20
[백준] 2576. 홀수 : C++  (0) 2022.02.19
[백준] 9325. 얼마? : C++  (0) 2022.02.15
[백준] 10178. 할로윈의 사탕 : C++  (0) 2022.02.13
[백준] 1009. 분산처리 : C++  (0) 2022.02.13
반응형

https://www.acmicpc.net/problem/1934

 

1934번: 최소공배수

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있

www.acmicpc.net

문제

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.

두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)

출력

첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.


풀이

유클리드 호제법을 사용해서 풀이한다

*유클리드 호제법*

최소공배수를 구하는 알고리즘

 

유클리드 호제법

두 양의 정수 a,b\ (a>b)a,b (a>b)에 대하여 a=bq+r\,\left(0\le r<b\right)a=bq+r(0≤r<b)[2]라 하면, a,ba,b의 최대공약수는 b,rb,r의 최대공약수와 같다. 즉,\gcd\left(a,\ b\right)=\gcd\left(b,\ r\right)gcd(a, b)=gcd(b, r)r=0r=0이라면, a,ba,b의 최대공약수는 bb가 된다.

인류 최초의 알고리즘이라고 한다 (신기)

최소공배수를 구해준 후 A, B 를 최소공배수로 나눈 수를 곱해준다

코드

#1934 최소 공배수
import sys

T = int(input())

for tc in range(T):
    A, B = map(int, sys.stdin.readline().split())
    a = A
    b = B
    while True:
        r = a % b
        if r == 0:
            break
        a = b
        b = r
    # 최소공배수 = b
    print((A//b)*(B//b)*b)

 

반응형

'study > 백준' 카테고리의 다른 글

[백준] 2446. 별 찍기 - 9 : C++  (0) 2022.01.31
[백준] 2445. 별 찍기 - 8 : C++  (0) 2022.01.30
[백준] 2444. 별 찍기 - 7 : C++  (0) 2022.01.26
[백준] 2443. 별 찍기 - 6 : C++  (0) 2022.01.25
[백준] 2442. 별 찍기 - 5 : C++  (0) 2022.01.25

+ Recent posts