1. 문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

- 제한 사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다
  • array는 길이 1 이상인 배열입니다.

2. 풀이 코드

#include <string>
#include <vector>
#include <algorithm>


using namespace std;

vector<int> solution(vector<int> arr, int divisor) {
	vector<int> answer;
    
    
    for(int item : arr)
    {
        if(item % divisor == 0)
            answer.push_back(item);
    }
    
    if(answer.size() > 0)
        sort(answer.begin(), answer.end());
    else
        answer.push_back(-1);
    

	return answer;
}

 

3. 정리

for문을 이용하여 각 원소를 divisor와 나머지 연산하여 0으로 나누어 떨어지면 answer 벡터배열에 넣고 sort 함수를 통해 오름차순 정렬한다. 

 

 

전체 시간 복잡도는 단계별로 분석하면

단계 시간복잡도
for 루프 O(n)
정렬 (sort) O(최악 O(n log n))  [algorithm 헤더의 sort는 퀵정렬을 사용]
빈 배열 처리 (else) O(1)

전체 시간복잡도는 O(n log n) 이다.

 

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

1. 문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

- 제한 조건

  • absolutes의 길이는 1 이상 1,000 이하입니다.
  • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
  • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

2. 풀이 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> absolutes, vector<bool> signs) {
	int answer = 0;

	for (int i = 0; i < absolutes.size(); i++) {
		bool sign = signs[i];

		sign == true ? answer += absolutes[i] : answer -= absolutes[i];
	}

	return answer;
}

 

3. 정리

배열의 사이즈 만큼 for문을 반복하여 두 개의 배열을 동시에 확인하고 sign[i] 값이 true면 +, false면 -하여 총합을 구한다.

 

전체 시간 복잡도는 for문 배열의 원소의 수(n)만큼 반복하므로  O(n) 이다.

 

 

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

1. 문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

- 제한 조건

  • x는 1 이상, 10000 이하인 정수입니다.

 

2. 풀이 코드

#include <string>
#include <vector>

using namespace std;

bool solution(int x) {
    bool answer = true;
    int sum = 0;

    for(int temp = x; temp > 0; temp/=10)
    {
        sum += temp % 10;
    }
    
	return x % sum == 0 ? true : false;

}

 

3. 정리

10과 나머지 연산 후 결과는 항상 1의 자릿수의 값이다. 그리고 10과 나누기 연산 후 결과는 해당 수의 자릿수가 감소한다. 이 점을 이용하여 자릿수의 총합(sum)을 구한 후 x와 하샤드 수인지 아닌지를 판별한다.

 

전체 시간 복잡도는 for문이 자릿수( log10(x) + 1 )만큼 반복하므로  O(log x) 이다.

 

 

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

'Algorithm' 카테고리의 다른 글

[프로그래머스] 서울에서 김서방 찾기  (0) 2025.03.07
[프로그래머스] 음양 더하기  (0) 2025.03.07
[프로그래머스] 정수 제곱근 판별  (0) 2025.03.07
백트래킹(Backtracking)  (0) 2021.05.06
구현  (0) 2021.04.27

1. 문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요. 

 

- 제한 사항

  • n은 1이상,  50,000,000,000,000 이하인 양의 정수입니다.

 

2. 풀이 코드

#include <string>
#include <vector>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    
    long long i;
    for(i=1 ; i*i <= n ; i++);
    
    if((i-1)*(i-1) == n) answer = i*i;
    else answer = -1;
    
    
    return answer;
}

 

3. 정리

사용하는 변수는 50,000,000,000,000 값의 범위가 int형이 표현하는 값의 범위를 초과하기 때문에 long long을 사용하며 for문을 이용하여 i 변수를 제곱근+1까지 실행한다. 이후에 i-1 = 제곱근, (i-1)*(i-1)이 n값과 일치 하다면  정답을 저장하는 변수에 i*i = (제곱근+1)* (제곱근+1) 값을 일치하지 않는다면 -1을 대입한다.

 

 

전체 시간 복잡도는 for문이 제곱근만큼 반복 하므로 O(√n) 이다.

 

 

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

'Algorithm' 카테고리의 다른 글

[프로그래머스] 음양 더하기  (0) 2025.03.07
[프로그래머스] 하샤드 수  (0) 2025.03.07
백트래킹(Backtracking)  (0) 2021.05.06
구현  (0) 2021.04.27
그리디 알고리즘(탐욕법)  (0) 2021.04.27

✅ 1. 프로세스(Process)란?

  • 정의: 실행 중인 프로그램 (OS에서 독립적으로 관리하는 작업 단위)
  • 특징:
    • 각각 독립된 메모리 공간(코드, 데이터, 힙, 스택)을 가짐
    • 프로세스 간 자원 공유 불가 (IPC 방식으로만 가능)
    • 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있음
  • 예제:
    • 크롬 브라우저의 각 탭 (각각의 탭이 개별 프로세스로 실행)
    • 터미널에서 실행한 Python 스크립트

✅ 2. 쓰레드(Thread)란?

  • 정의: 프로세스 내에서 실행되는 작은 단위 (Lightweight Process)
  • 특징:
    • 동일한 메모리 공간을 공유 (코드, 데이터, 힙은 공유하지만 스택은 개별적)
    • 컨텍스트 스위칭 비용이 프로세스보다 낮음
    • 하나의 프로세스에서 여러 쓰레드를 실행하면 병렬 처리 가능
  • 예제:
    • 크롬 브라우저 내에서 여러 개의 탭이 동시에 실행
    • 게임에서 캐릭터 이동, 배경 음악, 충돌 감지 등이 별도 쓰레드로 동작

✅ 3. 프로세스 vs 쓰레드 비교표

비교 항목 프로세스 (Process) 쓰레드 (Thread)
메모리 공간 독립적 공유 (코드, 데이터, 힙)
실행 단위 개별 실행 프로세스 내의 실행 단위
자원 공유 IPC 필요 (느림) 공유 가능 (빠름)
컨텍스트 스위칭 비용 높음 (OS가 프로세스 간 전환) 낮음 (같은 프로세스 내 전환)
병렬 실행 가능 (멀티 프로세싱) 가능 (멀티 쓰레딩)
예제 브라우저의 여러 창 브라우저의 여러 탭

 


✅ 4. 언제 프로세스를 쓰고, 언제 쓰레드를 쓸까?

 

상황 프로세스 사용 쓰레드 사용
CPU 사용량이 높은 작업
IO 작업(파일, 네트워크)
독립적인 작업 실행 필요
데이터 공유 필요 ❌ (IPC 필요) ✅ (메모리 공유)

✅ 5. 결론

  • 프로세스는 완전히 독립된 실행 단위, 쓰레드는 같은 프로세스 내에서 실행되는 가벼운 실행 단위
  • 병렬 처리가 필요한 경우:
    • CPU 바운드 작업(연산 집중적) → 멀티프로세스
    • IO 바운드 작업(네트워크, 파일 처리) → 멀티쓰레드
  • 자원 공유가 필요하면 쓰레드, 독립성이 필요하면 프로세스 사용

'개발지식' 카테고리의 다른 글

ERD (Entity Relationship Diagram)  (6) 2025.06.15
RAM 영역  (0) 2025.03.04

---------------------- (높은 주소)
|       코드        |  (프로그램 실행 코드)
----------------------
|  데이터 영역 (정적/전역 변수)  |
----------------------
|        힙        |  (동적 메모리 할당 - 위로 성장)
----------------------
|        스택       |  (함수 호출 시 생성 - 아래로 성장)
---------------------- (낮은 주소)

 

1. 코드(Code) 영역 : 프로그램의 실행코드가 저장되는 공간

2. 데이터(Data) 영역 : 프로그램이 실행될 때 정적(static) 및 전역(global) 변수가 저장되는 영역

3. 힙(Heap) 영역 : 동적 메모리 할당을 담당하는 영역으로, 런타임에 크기가 결정됨

4. 스택(Stack) 영역 : 함수 호출 시 지역변수, 매개변수, 리턴주소 등이 저장되는 영역

                                  함수가 호출될 때마다 새로운 스택 프레임(Stack Frame)이 생성되며

                                  함수 종료 시 자동으로 해제됨

                                  후입선출(LIFO, Last In First Out) 방식, 공간이 한정적

                                  너무 많은 재귀 호출 발생 시 스택 오버플로(Stack Overflow)가 발생할 수 있음

 

'개발지식' 카테고리의 다른 글

ERD (Entity Relationship Diagram)  (6) 2025.06.15
프로세스와 쓰레드  (0) 2025.03.06
  • 어떠한 집합에서  정해진 기준에 따라 원소의 순서를 선택하는 문제를 푸는 문제에 적합 ex) 순열
  • 깊이우선탐색 (DFS)
  • 모든 문제에 대해서 효율적인 알고리즘이라고 보장할 순 없으나 대부분의 문제 사례에 대해 효율적이다.
  • ex) n-Queens, 부분집합의 합, 0-1 배낭문제 등

미로찾기의 경우 길을 찾다가 갈림길에서 먼저 특정한 방향으로 탐색을 시작한다. 그러다가 막힌 길이 나오는 경우 왔던 길을 다시 돌아와서 갈림길에서 다른 경로를 선택하여 탐색한다. 

 

# 상태공간트리

- 상태 공간: 해답을 탐색하기 위한 탐색 공간

- 상태공간트리: 탐색 공간을 트리 형태의 구조로 암묵적으로 해석

 

# 백트래킹 기법

상태공간트리를 깊이우선탐색으로 탐색하고, 방문 중인 노드에서 조건에 의해 더 하위 노드를 탐색하여도 해답이 없다고 판단이 된다면 하위트리를 방문하지 않고 부모 노드로 되돌아 간다. - 가지치기(pruning)

- 가지치기한 상태: 해당 노드의 방문하지 않는 하위트리 (pruned state)

 

# 유망함(promising) : 해답이 있다고 생각하는 것

 

# n-Queens 문제

n X n 체스판에 n개의 퀸을 배치하는 문제, 어떤 퀸도 다른 퀸에 의해서 잡히지 않도록 배치해야 함

즉, 같은 행, 열, 대각선에는 다른 퀸을 놓을 수 없음

- 백트래킹 적용:

  • n^2개의 위치에 퀸을 놓을 수 있음
  • 기준: 새로 놓을 퀸이 다른 다른 퀸을 잡을 수 있음(같은 가로,세로,대각선)
  • 원소의 순서: 퀸을 놓을 수 있는 n개의 위치

4-Quenns 문제를 생각해보면 1번째 조건은 걑은 가로줄에 놓을 수 없으므로 4개의 퀸을 모두 다른 행을 선택해야하고 그 중에 4개의 열중에서 자리를 선택해야 하므로 4X4X4X4 =256 가지이다. 그리고 가지치기를 하는 경우는 퀸 2개를 놓았을 때 같은 열에 위치한다면 더 이상 다른 퀸을 놓지 않아도 유망하지 않다고 판단하고 더 이상 탐색하지 않는다.

 

 

구현이란 "풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제"를 의미한다.

  • 알고리즘은 간단하나 코드가 길어지는 경우
  • 실수 연산 및 특정 소수점 까리 출력해야 하는 경우
  • 문자열을 어떠한 기준에 따라 처리해야 하는 경우
  • 적절한 라이브러리를 찾아서 사용해야 하는 경우

보통 문제에서 2차원 공간을 필요로 하는 경우에는 행렬의 의미로 사용되는 경우가 많다. 

ex) 캐릭터 이동 문제

 

- 코드

for i in range(5):
    for j in range(5):
        print('(', i, ',', j, ')', end=' ')
    print()

 

- 결과

 

- 예시

2차원 공간인 배열의 이동을 1차원 배열을 2개 생성하여 방향벡터로 이용하는 경우가 있다.

# 동, 북, 서, 남
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
direction = ['동', '북', '서', '남']
# 현재 위치
x, y = 2, 2
print(f'현재 위치: {x},{y}')
for i in range(4):
    # 이동
    nx = x + dx[i]
    ny = y + dy[i]
    print(nx, ny, direction[i])

- 결과

- 문제

상하좌우

2배원 배열에서 U,D,L.R에 따라 상하좌우로 이동한다. 시작 지점은 1,1 이고 가장 오른쪽 아래 끝 지점은 N,N이다.

 

입력 조건:

첫째 줄에 배열의 크기기 N이 주어지고(1<=N<=100), 둘째 줄에서는 이동할 문자들이 주어진다. (1 <=이동 횟수 <=100)

 

출력 조건: 첫째 줄에 최종적으로 도착할 지점의 좌표를 공백을 기준으로 구분하여 출력

 

- 코드

n = int(input())
moving = list(input().split())

direction = ['U', 'D', 'L', 'R']
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
x, y = 0, 0

for move in moving:
    # 이동
    for i in range(4):
        if direction[i] == move:
            nx = x + dx[i]
            ny = y + dy[i]
            break

    # 범위 밖으로 나가는 경우는 그냥 넘어간다.
    if nx <= -1 or ny <= -1 or nx >= n-1 or ny >= n-1:
        continue
    else:
        x = nx
        y = ny

print(x + 1, y + 1)

 

- 결과

 

 

+ Recent posts