문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42587?language=python

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

 

문제 설명
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

제한사항
priorities의 길이는 1 이상 100 이하입니다.
priorities의 원소는 1 이상 9 이하의 정수입니다.
priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

 

문제풀이

    
우리는 location에 해당하는 프로세스가 언제 실행되는지 알고싶은거임.

 

# priorities에 있는 숫자들은 말그래도 각 프로세스의 우선순위를 의미.

# [1, 1, 9, 1, 1, 1]
# => [C, D, E, F, A, B]
# 프로세스 번호는 priorities의 인덱스 번호라고 하자.
# 그럼 큐에 저장을 할때 (key, value) 형태로 저장하면 좋겠지?
# => key = 인덱스번호, value = 우선순위값

코드
from collections import deque

def solution(priorities, location):
    answer = 0
    queue = deque([(priority, key) for (key, priority) in enumerate(priorities)])   # 우선순위값과 프로세스번호(인덱스)를 튜플로 묶어 큐에 삽입.
 

    # 큐가 남아있을 동안 pop은 계속됨.
    while queue:
        curPriority, curKey = queue.popleft()   # (우선순위, 프로세스번호)를 pop함.
        
        # cur와 배열안의 나머지숫자들과 비교.
        if all(curPriority >= item for (item, key) in queue):
            answer += 1
            # 알고싶은 위치의 프로세스 넘버라면 return.
            if curKey == location:
                return answer
        else:
            queue.append((curPriority, curKey))

 

 

자바스크립트로도 풀었다.

function solution(priorities, location) {
    let queue = priorities.map((priority, index) => ({ priority, index}));
    let answer = 0;
    
    while (queue.length) {
        let cur = queue.shift();
        
        // 현재 프로세스의 우선순위가 더 작은게 있다면 현재프로세스는 다시 큐에 삽입
        if (queue.some(item => item.priority > cur.priority)) {
            queue.push(cur);
        } else {
            answer += 1
            if (cur.index === location) {
                return answer;
            }
        }
    }
    
}
문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42747?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

 

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항
과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

문제풀이

 

H-Index 란, h번 이상 인용된 논문이 h편이상, 나머지가 h번 이하 인용됐을때

그때의 h중의 최댓값이 H-index라고 한다.
    
citations  - 발표한 논문의 인용횟수 들이 담긴 배열
len(citations)  - 발표 논문 수

 

테스트케이스 입력값을 예로 들면 citations = [3, 0, 6, 1, 5]

i 0 1 2 3 4
citations[i] 6  5  1 0

 

1. 일단 내림차순 정렬을 한다

왜? => h번이상 인용된 논문수가 인용횟수보다 커야하므로, 그리고 그중에서 최댓값을 찾아야하므로

 

 

citations 값이 i보다 크면, 계속 개수를 세어준다.

작거나 같아지는 지점( if citations[i] <= i: )에 도달하면 i값을 return한다. 

=> 더이상 i번 이상 인용된 논문이 없다는 뜻이므로.

 

 

코드
def solution(citations):
    answer = 0
    n = len(citations)
    
    citations.sort(reverse=True);
    
    for i in range(n):
        if i >= citations[i]:
            return i
    return n

 

자바스크립트로도 풀었다.

function solution(citations) {
    let answer = 0;
    let n = citations.length;
    
    citations.sort((a, b) => b - a);    //내림차순 정렬
  
    // i    0 1 2 3 4
    // c[i] 6 5 3 1 0
    
    for (let i = 0; i < n; i++) {
        if (i >= citations[i]) {
            answer = i
            return answer
        }
    }
    return n
}
문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42746?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

 

문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

문제풀이

 

처음에는 다음과 같은 생각을 하였다.

순서 재배치하여 만들 수 있는 가장 큰수 구하기 문제.

 

정렬을 하자
    # => 여러자리수라면 가장 앞자리를 보면 될듯?, 그다음 다음자리수 이렇게

    # 요구사항
    # 1. 숫자가 큰 아이템부터 배치.
    # 2. 숫자가 두자리 수 이상이라면 맨 앞자리부터 비교하여 큰 숫자 부터 배치
    # 3. 한자리수와 두자리수이상의 숫자를 비교할때 같은 방식으로 비교하되,
    #    한자리수가 두자리수이상숫자의 각자릿수 숫자들 보다 한개라도 더 큰게 있다면  (예를 들어 3 vs 30)
    #    한자리수를 먼저 배치.

 

파이썬에서 문자열 대소비교

문자열은 사전순서대로 비교된다.

 

3 vs 30 을 비교한다고 하면

(1) 첫번째 3이 같으므로 다음자릿수로 넘어간다.

(2) 3은 두번째 문자가 없지만, 30은 0 이라는 문자가 있어 30이 더 큰것으로 처리된다.

 

그러나 33과 3030을 비교한다고 하면,

(1) 3이 같으므로 다음자릿수로 넘어감

(2) 3 vs 0 인데 3이 더 크므로 33이 더 큰 문자열인 것으로 처리된다. 

 

핵심

1. 각 배열의 숫자를 문자열로 변환
2. 정렬함수 활용해 내림차순 정렬
3. 이때 각 문자열에 *3을 해주어 길이를 늘린후 정렬.
=> 테스트케이스로 나올 수 있는 원소범위가 1000이하이기 때문에
하지만 1000은 4자리수 아닌가 싶었지만,
하지만 1000은 1이랑 비교해도 3배로 늘린다면
100010001000 vs 111 
=> 111이 더 큰것으로 처리되므로 문제 X

마지막에

int() 변환후 다시 str() 변환해야 테스트케이스 통과됨.

코드
def solution(numbers):
    answer = ''
    
    for i in range(len(numbers)):
        numbers[i] = str(numbers[i])

    numbers.sort(key=lambda x: x*3, reverse=True)
    
    for item in numbers:
        answer += item
   
    return str(int(answer))

 

 

자바스크립트로 풀면

function solution(numbers) {
    var answer = '';
    
    stringArr = numbers.map(item => String(item));
    answer = stringArr.sort((a, b) => (b + a) - (a + b)).join('');
    
    return answer[0] === "0" ? "0" : answer;
}
문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42577?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421


전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.

 

문제풀이

 

 나의 아이디어
 번호의 길이가 다른데, 짧은번호가 배열의 앞에와야 유리한데..
 0번째 인덱스값과 그 나머지값을 비교하는 방식으로 늘려나가면서 검사?


 1. 배열을 받아서 각 문자열 값을 숫자로 변환한후 오름차순 정렬

변환하는 과정중에 

for item in arr:

   item = int(item) 으로 하니 배열값이 갱신이 안되어

 

for i in range()를 사용했다.

근데 나중에보니 오름차순 정렬을 문자열 상태일 때 해도 된다는걸 잊고있었다....

 

결국 정렬 후 감이 잘 안와서, 해시테이블을 쓰기로 했다.

 

구현할 로직

1. 폰북 배열 속 원소를 key로 하는 myDict 키,값 생성.
2. 폰북 속을 탐색하며 item 마다 각 item의 문자를 부분문자열로 하는 부분문자열 생성.
3. 그리고 그 부분 문자열이 myDict의 key로 속해있는지 검사
4. + 자기자신이 아닌지 검사
5. 조건문 하나라도 충족하면 False값 반환

 

 

코드
def solution(phone_book):
    answer = True
    myDict =  {}
    
    for item in phone_book:
        myDict[item] = 1

    for item in phone_book:
        part = ""
        for num in item:
            part += num # 문자를 더해가며 부분문자열 생성
            if part in myDict and part != item:
                return False
    # 1. 폰북 배열 속 원소를 key로 하는 myDict 키,값 생성.
    # 2. 폰북 속을 탐색하며 item 마다 각 item의 문자를 부분문자열로 하는 부분문자열 생성.
    # 3. 그리고 그 부분 문자열이 myDict의 key로 속해있는지 검사
    # 4. 자기자신이 아닌지 검사
    # 5. 조건문 하나라도 충족하면 False값 반환
    return answer
문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/43163

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

문제 설명

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.

예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.

두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
  • begin과 target은 같지 않습니다.
  • 변환할 수 없는 경우에는 0를 return 합니다.

입출력 예

begin              target                  words                                                                                                                           return

"hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
"hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0

입출력 예 설명

예제 #1
문제에 나온 예와 같습니다.

예제 #2
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.

문제풀이

처음엔 DFS로 풀이에 접근하였으나, 역시 BFS가 더 익숙하고 쉽게 느껴진다.

문제를 풀때 요구사항에 맞는 알고리즘 및 자료구조를 최대한 빨리 캐치하는 능력이 중요한 것 같고,

문제를 많이 풀면서 향상 시킬 수 있도록 해야겠다.

 

핵심

단어를 target으로 만드는데에 필요한 최소횟수를 구하는것이므로 BFS활용이 좋아보인다.

1. 큐를 만들어 [시작단어, depth] 삽입

2. 한번에 한개의 알파벳만을 변환할 수 있으므로,

  words에 있는 후보 단어들과 큐에서 꺼낸 단어를 비교하여 한글자만 다르다면 큐에 삽입.

   그리고 depth 1증가

 

 

코드
from collections import deque

def solution(begin, target, words):
    answer = 0
    visited = [0] * (len(words))
    
    # BFS시행: 조건에 부합하는 변환과정을 위한 단어를 큐에 삽입해가기
    def BFS(data):
        queue = deque([[data, 0]]) # 단어, 변환횟수
        while queue:
            data, cnt = queue.popleft()
            
            if data == target:
                return cnt
          
            # words 배열의 단어중 한개만 변환하여 바꿀 수 있는 단어 탐색
            for i in range(len(words)):
                # 방문안한것중에서 탐색
                if not visited[i]:
                    check = 0
                    for j in range(len(words[i])):
                        # 다른 문자가 하나여야만 하므로
                        if data[j] != words[i][j]:
                            check += 1
                    if check == 1:
                        queue.append([words[i], cnt+1])
                        visited[i] = 1
        
        return 0
    
    answer = BFS(begin)
    return answer
문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/43162

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

문제 설명

 

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

 

제한사항

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.
문제풀이

네트워크의 개수를 return 해야한다. 나는 BFS로 풀었다. 

쉽게 말하면 총 그래프의 구역 수를 세는 문제이다.

Edge로 이어진 네트워크 그룹을 세야하므로,

방문리스트를 만들고 방문하지 않은 모든 노드를 시작으로 BFS를 시행한 다음,

한번의 BFS가 끝날때마다 answer를 1 늘리면 된다.

 

주의할 점은,

백준의 "적록색약"이나 "유기농배추"처럼 이차원 배열에서 구역수를 세는 것이 아닌,

실제 그래프 상에서 구역수를 세는 것이 핵심이다.

굳이 말하면 백준의 "바이러스" 문제와 비슷할 것 같다.

 

코드
from collections import deque

def solution(n, computers):
    answer = 0
    visited = [0] * n
    queue = deque()
    
    def BFS(node):
        queue.append(node)
        visited[node] = 1
        while queue:
            v = queue.popleft()
                
            for nv in range(n):
                if computers[v][nv] == 1 and not visited[nv]:
                    queue.append(nv)
                    visited[nv] = 1
    
    for i in range(n):
        if not visited[i]:
            BFS(i)
            answer += 1
            
    return answer

 

+ Recent posts