N, K = map(int, input().split())

def factorial(N):
    return N * factorial(N-1)  if N>1 else 1



print(int(factorial(N) / (factorial(N-K)*factorial(K))))

 

정리

이항계수란 주어진 집합에서 원하는 개수만큼 순서없이 뽑는 조합의 개수를 의미한다.

이항계수 공식은 다음과 같다

nCk = N! / (N-K)! K! 

'Algorithm' 카테고리의 다른 글

BOJ - 24723번 - 녹색거탑  (0) 2025.07.01
BOJ - 15439번 - 베라의 패션  (1) 2025.07.01
BOJ - 28278번 - 큐 2  (0) 2025.06.30
BOJ - 28278번 - 스택 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28

 

 

N = int(input())


print(2 ** N)

 

정리

각층 마다 생기는 경우의 수는 층의 갯수마다 2의 제곱배로 늘어난다

2^N

시간 복잡도는 1번의 연산만 진행하므로 O(1) 

 

 

출처 : https://www.acmicpc.net/problem/24723

'Algorithm' 카테고리의 다른 글

BOJ - 11050번 - 이항 계수 1  (0) 2025.07.01
BOJ - 15439번 - 베라의 패션  (1) 2025.07.01
BOJ - 28278번 - 큐 2  (0) 2025.06.30
BOJ - 28278번 - 스택 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28

 

N = int(input())


print(N * (N-1))

 

 

 

 

정리

N개의 상의 중에 자신의 색상만 뺀 나머지를 선택하는 경우의 수를 구한다.

N * (N-1)

한번의 연산만 진행하므로 시간 복잡도는 O(1) 

 

 

 

출처 : https://www.acmicpc.net/problem/15439

'Algorithm' 카테고리의 다른 글

BOJ - 11050번 - 이항 계수 1  (0) 2025.07.01
BOJ - 24723번 - 녹색거탑  (0) 2025.07.01
BOJ - 28278번 - 큐 2  (0) 2025.06.30
BOJ - 28278번 - 스택 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28

 

 

import sys
from collections import deque

input = sys.stdin.readline
commands = int(input())
class Queue:
    def __init__(self):
        self.items = deque()

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if self.empty():
            return -1
        return  self.items.popleft()

    def size(self):
        return len(self.items)

    def empty(self):
        return int(len(self.items) == 0)

    def front(self):
        if self.empty():
            return -1
        return self.items[0]

    def back(self):
        if self.empty():
            return -1
        return self.items[-1]



q = Queue()
for _ in range(commands):
    command = input().strip()

    if command.startswith("push"):
        _, num = command.split()
        q.push(num)
    elif command == "pop":
        print(q.pop())
    elif command == "size":
        print(q.size())
    elif command == "empty":
        print(q.empty())
    elif command == "front":
        print(q.front())
    elif command == "back":
        print(q.back())
    else:
        print("not matched")

 

정리

collections.deque 사용

deque는 양쪽에서 O(1) 시간에 삽입/삭제가 가능한 자료구조이므로 큐에 적합

 

 

 

출처 : https://www.acmicpc.net/problem/18258

'Algorithm' 카테고리의 다른 글

BOJ - 24723번 - 녹색거탑  (0) 2025.07.01
BOJ - 15439번 - 베라의 패션  (1) 2025.07.01
BOJ - 28278번 - 스택 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28
BOJ - 13909번 - 창문 닫기  (0) 2025.05.28

import sys
input = sys.stdin.readline
commands = int(input())


class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        return -1

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        return -1

    def is_empty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)


s = Stack()

for _ in range(commands):
    command = input()
    if command[0] == "1":
        num = int(command[2:])
        s.push(num)
    elif command[0] == "2":
        print(s.pop())
    elif command[0] == "3":
        print(s.size())
    elif command[0] == "4":
        print(int(s.is_empty()))
    elif command[0] == "5":
        print(s.peek())

 

정리

가독성을 위해 class를 사용하여 스택을 구현한다.

전체 시간복잡도는 command(명령어) 만큼 실행하므로 O(N)

 

 

 

출처 : https://www.acmicpc.net/problem/28278

'Algorithm' 카테고리의 다른 글

BOJ - 15439번 - 베라의 패션  (1) 2025.07.01
BOJ - 28278번 - 큐 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28
BOJ - 13909번 - 창문 닫기  (0) 2025.05.28
[프로그래머스] 제출 내역  (0) 2025.04.14

에라토스테네스의 체는 2부터 N까지의 자연수 중에서 소수를 빠르고 효율적으로 찾는 대표적인 알고리즘입니다. 이 방법은 소수가 아닌 수(합성수)를 체로 걸러내듯이 제거해 나가면서 소수만 남기는 방식입니다.

동작 원리 요약
1. 2부터 N까지 모든 수를 나열
2. 남아있는 수 중 가장 작은 수(i)를 소수로 판정
3. i의 배수(2i, 3i, 4i, ...)를 모두 제거
4. 이를 N의 제곱근까지 반복

이 과정을 거치면 남아있는 수가 모두 소수입니다.

 

코드 예시

n = 100  # 2부터 100까지 소수 구하기
prime = [True for _ in range(n + 1)]  # 소수 여부를 저장하는 리스트

for i in range(2, int(n**0.5) + 1):
    if prime[i]:
        for j in range(i * 2, n + 1, i):  # i의 배수들은 소수가 아님
            prime[j] = False

# 소수 출력
for i in range(2, n + 1):
    if prime[i]:
        print(i, end=' ')



시간 복잡도  
O(nloglogn)으로, 매우 효율적

한 번에 여러 소수를 구할 때 특히 빠르다.
특정 범위의 소수 개수, 소수의 합 등 다양한 문제에 응용 가능

'Algorithm' 카테고리의 다른 글

BOJ - 28278번 - 큐 2  (0) 2025.06.30
BOJ - 28278번 - 스택 2  (0) 2025.06.30
BOJ - 13909번 - 창문 닫기  (0) 2025.05.28
[프로그래머스] 제출 내역  (0) 2025.04.14
[프로그래머스] 덧칠하기  (0) 2025.04.14

문제
서강대학교 컴퓨터공학과 실습실 R912호에는 현재 N개의 창문이 있고 또 N명의 사람이 있다. 1번째 사람은 1의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다.  2번째 사람은 2의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다. 이러한 행동을 N번째 사람까지 진행한 후 열려 있는 창문의 개수를 구하라. 단, 처음에 모든 창문은 닫혀 있다.

예를 들어 현재 3개의 창문이 있고 3명의 사람이 있을 때,

1번째 사람은 1의 배수인 1,2,3번 창문을 연다. (1, 1, 1)
2번째 사람은 2의 배수인 2번 창문을 닫는다. (1, 0, 1)
3번째 사람은 3의 배수인 3번 창문을 닫는다. (1, 0, 0)
결과적으로 마지막에 열려 있는 창문의 개수는 1개 이다.

입력
첫 번째 줄에는 창문의 개수와 사람의 수 N(1 ≤ N ≤ 2,100,000,000)이 주어진다.

출력
마지막에 열려 있는 창문의 개수를 출력한다.

예제 입력 1 
3
예제 출력 1 
1
예제 입력 2 
24
예제 출력 2 
4


N = int(input())
print(int(N**0.5))

 

정리

 

**완전제곱수(perfect square)**란 어떤 정수 k에 대해 k² 형태로 표현되는 수
예: 1 = 1², 4 = 2², 9 = 3², 16 = 4², ..., k² ≤ N

우리가 궁금한 건:

N 이하의 완전제곱수는 총 몇 개인가?


 

모든 자연수 i (1 ≤ i ≤ k)에 대해 i²를 구했을 때, i² ≤ N을 만족해야 완전제곱수임.
여기서 가장 큰 그런 i는 바로 i = ⌊√N⌋, 즉 int(N**0.5)이다.

 

 

 

 

출처 : https://www.acmicpc.net/problem/13909

'Algorithm' 카테고리의 다른 글

BOJ - 28278번 - 스택 2  (0) 2025.06.30
에라토스테네스의 체  (0) 2025.05.28
[프로그래머스] 제출 내역  (0) 2025.04.14
[프로그래머스] 덧칠하기  (0) 2025.04.14
[프로그래머스] 바탕화면 정리  (0) 2025.04.10

1. 문제 설명

휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.

예를 들어, 1번 키에 "A", "B", "C" 순서대로 문자가 할당되어 있다면 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"가 되는 식입니다.

같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 심지어 아예 할당되지 않은 경우도 있습니다. 따라서 몇몇 문자열은 작성할 수 없을 수도 있습니다.

이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 알아보고자 합니다.

1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return 하는 solution 함수를 완성해 주세요.

단, 목표 문자열을 작성할 수 없을 때는 -1을 저장합니다.

 

- 제한 사항

  • 1 ≤ keymap의 길이 ≤ 100
    • 1 ≤ keymap의 원소의 길이 ≤ 100
    • keymap[i]는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미합니다.
      • 예를 들어 keymap[0] = "ABACD" 인 경우 1번 키를 한 번 누르면 A, 두 번 누르면 B, 세 번 누르면 A 가 됩니다.
    • keymap의 원소의 길이는 서로 다를 수 있습니다.
    • keymap의 원소는 알파벳 대문자로만 이루어져 있습니다.
  • 1 ≤ targets의 길이 ≤ 100
    • 1 ≤ targets의 원소의 길이 ≤ 100
    • targets의 원소는 알파벳 대문자로만 이루어져 있습니다.

2. 풀이 코드

#include <string>
#include <vector>
#include <map>
using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer;

    map<char, int> keyNumber;


    for (string keyInfo : keymap)
    {
        for (int i = 0; i < keyInfo.length(); i++)
        {
            if (keyNumber.find(keyInfo[i]) == keyNumber.end())
                keyNumber[keyInfo[i]] = i + 1;
            else if(keyNumber[keyInfo[i]] > i)
                keyNumber[keyInfo[i]] = i+1;

        }

    }


    for (string target : targets)
    {
        int count = 0;
        for (int i = 0; i < target.length(); i++)
        {
            if (keyNumber.find(target[i]) == keyNumber.end())
            {
                count = -1;
                break;
            }
            else       
                count += keyNumber[target[i]];


        }
        answer.push_back(count);
    }



    return answer;
}

 

3. 정리

K:  keymap 문자열 수
L₁ : 각 keymap  문자열의 길이
T  : target 문자열 수
L₂ : 각 target 문자열의 길이

 

1. map에 각 문자별로 가장 작은 횟수로 도달할 수 잇는 횟수는 저장한다.

2. targets의 배열의 문자열을 순회하면서 1번에서 저장한 도달할 수 있는 최소 횟수를 더한다. 

 

전체 시간 복잡도는 문자열 길이만큼 순회하기 때문에 O(K × L₁ + T × L₂)이다.

 

출처 :https://school.programmers.co.kr/learn/courses/30/lessons/160586

'Algorithm' 카테고리의 다른 글

에라토스테네스의 체  (0) 2025.05.28
BOJ - 13909번 - 창문 닫기  (0) 2025.05.28
[프로그래머스] 덧칠하기  (0) 2025.04.14
[프로그래머스] 바탕화면 정리  (0) 2025.04.10
[프로그래머스] 공원 산책  (0) 2025.04.09

+ Recent posts