• User threads - 라이브러리에 의해 스레드 형태로 만들어지는 모든 모양
    • 실행되기 위해 라이브러리가 있어야 됨
    • 유저 모드의 스레드들은 커널 스레드와 결합하여 최종적으로는 커널 함수로 돌아감
  • Kernel threads - 실제로 커널(또는 CPU)에서 처리되는 스레드
  • user 모드에서 라이브러리에 의해 스레드처럼 만들고 돌아가는 형태로 코딩 -> 관리할 여러 모델이 생김 -> 함수 하나에서 스레드들이 떨어짐 + 커널 스레드와 만나서 처리됨
  • 동시에 여러 스레드를 동작시킴
  • Many-to-One : 유저 모드의 많은 스레드들이 하나의 커널 스레드와 결합  

  • One-to-One : 하나의 유저 스레드와 하나의 커널 스레드가 결합

  • Many-to-Many : 하나 이상의 유저 스레드가 역시 하나 이상의 커널 스레드와 결합

  • Two-level : Many-to-Many와 One-to-One이 함께 있음

  • 스레드 라이브러리
  • 스레드를 만드는 방법
    1. pthread(POSIX) : 운영체제의 표준안을 만들어 놓고 이 표준안에 따라 각 회사들이 운영체제를 만듦
    2. windows에서 사용하는 windows set
  • 스레드를 사용하는 방법 - 예제
  1. pthread 방식

  1. 전역 변수 선언
  2. void * 는 어떤 타입인지 모른다는 뜻 -> 함수에서 void * 를 사용하면 return 값을 사용하지 않는다는 의미(주소를 가짐)
  3. arg를 입력 변수로 받음
  4. printf 5번 반복한 후 pthread_exit(0)로 스레드를 끝냄
  5. pthread_t라는 구조체를 3개 선언
  6. pthread_create로 pthread를 만듦 -> pthread.h의 라이브러리 함수
  7. 첫 번째 인자는 리턴되는 스레드 번호, 세 번째는 Thread라는 함수를 스레드로 만들겠다는 의미, 마지막 값은 이 함수에 넣을 인자를 의미
  8. Thread라는 함수를 독립적으로 떼어내어 이 프로세스 내에서 메인 함수와 독립적으로 실행시킴 -> for문으로 같은 스레드를 3개 만들어냄
  9. printf를 하면 입출력이 생기므로 스케줄링이 발생하고 스레드 사이에 순서가 바뀔 수는 있음
  10. 결과는 printf가 main문에서 3개, Thread에서 15개, 총 18개가 출력

2. windows 방식

  1. windows.h에서 윈도우의 함수들을 사용
  2. ThreadFunc를 선언
  3. 구조체 선언
  4. 주소를 넘겨주므로 내가 원하는 값으로 바꿔서 사용이 가능
  5. Sleep은 스케줄링을 요청한다는 의미 -> 잠깐 쉬는 동안 다른 순서의 일을 처리하라는 의미
  6. 10번 반복 -> 반복할 때마다 다른 스레드에 기회를 줌
  7. CreateThread로 스레드를 만듦

 

  • 문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 배열 arr에서 제거되고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다.
예를들면

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1]을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3]을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

  • 제한사항
  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
  • 입출력 예

  • 내가 만든 코드
#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    vector<int> answer;
    for(int i = 1; i<arr.size(); i++){
        if(arr[i]==arr[i-1]){
            continue;
        }
        else{
            answer.push_back(arr[i-1]);
        }
    }
    answer.push_back(arr[arr.size()-1]);
    return answer;
}
  • 코드 채점 결과

  • 처음에는 arr자체에서 중복되는 값들을 비워내는 형식으로 진행했었다.
  • 물론 정확성 테스트는 모두 통과를 했으나 효율성에서 시간 초과가 나와 다시 한번 생각해보았다.
  • 다시 생각해낸 방법은 비어있는 vector에 중복되는 값을 push 해주는 방식이었다.
  • 이 방식을 사용하니 훨씬 더 빨리 테스트를 마칠 수 있었다.

'프로그래머스' 카테고리의 다른 글

level 1 - 가운데 글자 가져오기(100/100)  (0) 2019.04.05
level 1 - 2016년(100/100)  (0) 2019.04.02
level 2 - 주식가격(100/100)  (0) 2019.04.01
level 2 - 기능개발(90/100)  (0) 2019.04.01
level 2 - 탑(100/100)  (0) 2019.03.31
  • 문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

  • 제한사항
  • s는 길이가 1 이상, 100이하인 스트링입니다.
  • 입출력 예

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    if(s.size()%2==1){
        return s.substr(s.size()/2,1);
    }
    else if(s.size()%2==0){
        return s.substr(s.size()/2-1,2);
    }
}
  1. 주어진 string의 길이가 홀수이면 가운데 한 글자만 return
  2. 주어진 string의 길이가 짝수이면 size()/2 - 1에서 2글자 return
  • 코드 채점 결과

 

'프로그래머스' 카테고리의 다른 글

level 1 - 같은 숫자는 싫어(100/100)  (0) 2019.04.05
level 1 - 2016년(100/100)  (0) 2019.04.02
level 2 - 주식가격(100/100)  (0) 2019.04.01
level 2 - 기능개발(90/100)  (0) 2019.04.01
level 2 - 탑(100/100)  (0) 2019.03.31
  • 문제 설명
  • 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a , b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 TUE를 반환하세요.
  • 제한 조건
  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일 같은 날짜는 주어지지 않습니다)
  • 입출력 예

  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer[] = {"THU","FRI","SAT","SUN","MON","TUE","WED"};
    int month[] = {31,29,31,30,31,30,31,31,30,31,30,31};
    int sum = 0;
    
    for(int i = 0; i<a-1; i++){
        sum += month[i];
    }
    sum += b;
    return answer[sum%7];
}
  1. 1월 1일이 금요일 이고 배열은 0번째부터 시작이므로 1번째의 day값을 금요일로 맞춰서 저장해 놓았다.
  2. 1~12월까지의 총 일수를 배열에 저장한다.
  3. 만약 5월 24일이라면 배열상으로 3번째(4월)까지의 일수를 더한 후 나머지 24일을 더하여 총일수를 구한다.
  4. 모두 더한 값을 7로 나누고 나머지값을 요일이 저장되어있는 answer배열에 넣으면 답이 나온다.
  • 코드 채점 결과

 

  • 문제 설명
  • 초 단위로 기록된 주식 가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
  • 제한사항
  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.
  • 입출력 예

  • 입출력 예 설명
  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
  • 내가 만든 코드
#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer(prices.size());
    for(int i = 0; i<prices.size(); i++){
        for(int j = i+1; j<prices.size(); j++){
            if(prices[i]<=prices[j]){
                answer[i]++;
            }
            else{
                answer[i]++;
                break;
            }
        }
    }
    return answer;
}
  • 코드 채점 결과

 

'프로그래머스' 카테고리의 다른 글

level 1 - 가운데 글자 가져오기(100/100)  (0) 2019.04.05
level 1 - 2016년(100/100)  (0) 2019.04.02
level 2 - 기능개발(90/100)  (0) 2019.04.01
level 2 - 탑(100/100)  (0) 2019.03.31
level 2 - 프린터(100/100)  (0) 2019.03.30
  • 문제 설명
  • 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100% 일 때 서비스에 반영할 수 있습니다.
  • 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
  • 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
  • 제한 사항
  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
  • 입출력 예

  • 입출력 예 설명
  • 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
    두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
    세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
  • 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
  • 내가 만든 코드
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    vector<int> day(progresses.size());
    bool F = true;
    int cnt = 1;
    
    while(F){
        for(int i = 0; i < progresses.size(); i++){
            if(progresses[i]>=100){
                for(int j = i; j >= 0; j--){
                    if(progresses[j] < 100){
                        day[i] = day[j]+1;
                        break;
                    }
                    if(i==progresses.size()-1&&j==0){
                        F = false;
                    }
                }
            }
            else{
                progresses[i] += speeds[i];
                day[i]++;
            }
        }
    }
    sort(day.begin(),day.end());
    for(int a = 0; a < day.size(); a++){
        for(int b=a+1; b<day.size();b++){
            if(day[a]==day[b]){
                cnt++;
                day.erase(day.begin()+b);
                b--;
            }
        }
        answer.push_back(cnt);
        cnt = 1;
    }
    return answer;
}
  1. progresses에 speeds를 더해주며 100이 될 때까지 반복한다. -> day라는 벡터도 만들어서 하나씩 증가시킨다.
  2. 그러다가 progresses중 하나가 100이 넘게 되면 그로부터 왼쪽으로 이동하며 100보다 큰지 확인한다.
  3. 0번째 progresses까지 모두 100이 넘지 않았다면 모두 100이 넘을 때까지 기다리며 day를 다시 늘려준다.
  4. 마지막 progresses가 100이 넘고 첫번째 progresses까지 모두 100이 넘었다면 while문을 탈출해서 겹치는 day들을 count 해준다.
  • 코드 채점 결과

  • 테스트 2번의 조건이 무엇인지 모르겠지만 통과하지 못했다.

 

'프로그래머스' 카테고리의 다른 글

level 1 - 2016년(100/100)  (0) 2019.04.02
level 2 - 주식가격(100/100)  (0) 2019.04.01
level 2 - 탑(100/100)  (0) 2019.03.31
level 2 - 프린터(100/100)  (0) 2019.03.30
level 2 - 124 나라의 숫자(100/100)  (0) 2019.03.28
  • 문제 설명
  • 수평 직선에 탑 N대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. 발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다.
  • 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. 높이가 4인 다섯 번째 탑에서 발사한 신호는 높이가 7인 네 번째 탑이 수신하고, 높이가 7인 네 번째 탑의 신호는 높이가 9인 두 번째 탑이, 높이가 5인 세 번째 탑의 신호도 높이가 9인 두 번째 탑이 수신합니다. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 레이저 신호는 어떤 탑에서도 수신할 수 없습니다.

  • 맨 왼쪽부터 순서대로 탑의 높이를 담은 배열 heights가 매개변수로 주어질 때 각 탑이 쏜 신호를 어느 탑에서 받았는지 기록한 배열을 return 하도록 solution 함수를 작성해주세요.
  • 제한 사항
  • heights는 길이 2 이상 100 이하인 정수 배열입니다.
  • 모든 탑의 높이는 1 이상 100 이하입니다.
  • 신호를 수신하는 탑이 없으면 0으로 표시합니다.
  • 입출력 예

  • 입출력 예 설명
  • 입출력 예 #1 - 앞서 설명한 예와 같습니다.
  • 입출력 예 #2

[1,2,3] 번째 탑이 쏜 신호는 아무도 수신하지 않습니다.
[4,5,6] 번째 탑이 쏜 신호는 3번째 탑이 수신합니다.
[7] 번째 탑이 쏜 신호는 6번째 탑이 수신합니다.

  • 입출력 예 #3

[1,2,4,5] 번째 탑이 쏜 신호는 아무도 수신하지 않습니다.
[3] 번째 탑이 쏜 신호는 2번째 탑이 수신합니다.
[6] 번째 탑이 쏜 신호는 5번째 탑이 수신합니다.
[7] 번째 탑이 쏜 신호는 6번째 탑이 수신합니다.

  • 내가 만든 코드

  1. 왼쪽으로 신호를 보내므로 첫 번째 for문은 0부터 시작, 두 번째 for문은 i보다 한 칸 작을때부터 시작하여 비교해주었다.
  2. 비교를 하다가 왼쪽 탑에 더 큰 층의 탑이 존재한다면 그 탑의 위치(j+1)를 answer에 넣어주고 비교할 탑을 바꿔서 비교한다.
  3. 위 과정을 반복한다.
  • 코드 채점 결과

 

'프로그래머스' 카테고리의 다른 글

level 2 - 주식가격(100/100)  (0) 2019.04.01
level 2 - 기능개발(90/100)  (0) 2019.04.01
level 2 - 프린터(100/100)  (0) 2019.03.30
level 2 - 124 나라의 숫자(100/100)  (0) 2019.03.28
level 2 - 타겟 넘버(100/100)  (0) 2019.03.28
  • 문제 설명
  • 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
    1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
    2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
    3. 그렇지 않으면 J를 인쇄합니다.
  • 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.
  • 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.
  • 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
  • 제한사항
  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
  • 입출력 예

  • 입출력 예 설명
  • 예제 #1 - 문제에 나온 예와 같습니다.
  • 예제 #2 - 6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.
  • 내가 만든 코드

  1. location값과 인쇄되는 priotiyies들 둘 다 확인해야 하는 문제였다.
  2. 첫 번째값을 나머지 값들과 비교하여 하나라도 우선순위가 높은 값이 있다면 push_back을 해준 후 처음 값을 지워줬다.
  3. location값이 0이었을때 인쇄하지 않고 가장 뒤로 보내게 되었다면 location도 가장 뒤에 해당하는 값으로 바꿔주었다.
  4. 만약 location값이 0이 아니라면 값을 1감소 시켰다.
  5. 0번째 인쇄물의 우선순위와 마지막 인쇄물의 우선순위까지 비교했을 때 더 큰 우선순위가 없다면 값을 없애기만 하고 answer(인쇄한 횟수)를 증가시켰다.
  6. 만약 인쇄했을때 location이 0이라면 원하는 인쇄물을 인쇄한 것이되므로 바로 answer을 return시켰다.
  7. 하지만 마지막하나가 원했던 인쇄물이라면 while문을 탈출하지 못하므로 for문 바깥에 마지막까지 남았을 경우를 추가해주었다.
  • 코드 채점 결과

  • 만들고 나니 형편없는 코드가 되었다.
  • 좀 더 깔끔하게 짤 방법이 있을 것 같은데 다른사람들도 비슷한 방식으로 푼 것 같았다.

'프로그래머스' 카테고리의 다른 글

level 2 - 기능개발(90/100)  (0) 2019.04.01
level 2 - 탑(100/100)  (0) 2019.03.31
level 2 - 124 나라의 숫자(100/100)  (0) 2019.03.28
level 2 - 타겟 넘버(100/100)  (0) 2019.03.28
level 1 - k번째수(100/100)  (0) 2019.03.24

+ Recent posts