728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • split 하고 min, max 함수로 결과 return

 

3. 코드

def solution(s):
    list_s = [int(x) for x in s.split(" ")]
    return f'{min(list_s)} {max(list_s)}'

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근방식

  • DP문제이다.
  • 바텀업 방식으로 해결하면 좋다.
  • 점화식 :
    4개의 열(Column) 중 현재 열과 같은 열을 제외한 나머지 값 중 최대값을 현재값에 더한다.
for j in range(4):
	land[i][j] += max([land[i-1][x] for x in list({0, 1, 2, 3} - {j})])
  • 가장 큰 합들이 마지막 열에 반영되었기 때문에 가장 아래 열에서 최대값을 선택하면 된다.

 

3. 코드

def solution(land):
    answer = 0

    for i in range(1, len(land)):
        for j in range(4):
            land[i][j] += max([land[i-1][x] for x in list({0, 1, 2, 3} - {j})])
        
    answer = max(land[len(land)-1])
        
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근방식

  • 주어진 brown과 yellow의 개수는 해당 색 부분의 넓이와 같다.
  • 가로를 x, 세로를 y라고 할 때, 주어진 brown과 yellow의 조합으로 xy와 x+y를 알 수 있다.
  • 간단한 이차방정식을 만들고 이후는 완전탐색으로 값을 찾음

 

3. 코드

def solution(brown, yellow):
    answer = []
    
    x_y = int(brown / 2) + 2
    xy = brown + yellow
    
    for x in range(1, x_y):
        for y in range(1, x_y):
            if (x + y == x_y) and (x*y == xy):
                if x >= y:
                    return [x, y]
        
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • 괄호가 "("면 push 한다.
  • 괄호가 ")"면 pop한다.
  • 문자열의 반복이 끝났을 때, 스택에 값이 남아있다면 잘못된 괄호이다.

 

3. 코드

def solution(s):
    list_stack = []
    
    for ch in s:
        if ch == "(":
            list_stack.append(ch)
        else:
            if list_stack == []:
                return False
            else:
                list_stack.pop()
            
    return list_stack == []

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • H-Index는 N편의 논문중 H번 인용된 논문이 H편 이상일 때의 최대값을 의미한다.
  • 논문의 순서는 중요하지 않다.
  • H-Index는 내부의 인용된 회수와 같지 않을 수도 있다.

 

3. 코드

def solution(citations):
    citations = list(reversed(sorted(citations)))
    len_citations = len(citations)
    max_citations = max(citations)
    h=0
    
    for h in range(max_citations, 0, -1):
        cnt = 0
        for x in citations: 
            if x >= h:
                cnt+=1
        if cnt >= h:
            break
        
    return h

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • S, D, T, *, #을 공백을 포함하여 replace 후 공백으로 split 해주면 서로 분리됨(마지막 공백은 제거)
  • 각 기호에 맞는 점수를 제곱해서 정수로 변경해줌
  • *은 현재와 이전 값에 *2 (해당 범위에 * 이나 다른 기호가 포함될 경우도 고려해서 미리 정수로 변경해줌)
  • #은 0으로 변경 후 현재 값에 -1
  • 정수로 변환된 전체 리스트를 합쳐줌 -> 총점

 

3. 코드

def solution(s):
    for str_tmp in ["S", "D", "T", "*", "#"]:
        s = s.replace(str_tmp, str_tmp + " ") 
    res = [x for x in s.split(" ")][:-1]
    
    for i in range(len(res)):
        x = res[i]
        if x == "*" or x == "#":
            continue
        
        if "S" in x:
            res[i] = int(x.replace("S", ""))
        if "D" in x:
            res[i] = pow(int(x.replace("D", "")), 2)
        if "T" in x:
            res[i] = pow(int(x.replace("T", "")), 3)
            
    for i in range(len(res)):
        if res[i] == "*":
            res[i] = 0
            res[i-1] *= 2
            if i-2 >= 0:
                if res[i-2] != 0:
                    res[i-2] *= 2
                else:
                    res[i-3] *= 2
        if res[i] == "#":
            res[i] = 0
            res[i-1] *= -1
    
    return sum(res)

 

4. 결과

각 과정 출력

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • 10진법을 2진법으로 만들때와 비슷하게 3으로 나눈 나머지를 리스트에 추가
  • 역순으로 들어갔기 때문에 문제에서 요구하는 앞뒤 반전은 생략
  • 해당 자리에 맞게 3의 제곱수를 곱해서 누적해줌

 

3. 코드

def solution(n):
    answer = 0
    tmp = []
    
    # 3^0:1, 3^1:3, 3^2:9, 3^3:27, 3^4:81...
    while(n!=0):
        tmp.append(n%3)
        n //= 3

    for x in range(len(tmp), 0, -1):
        i = len(tmp) - x
        answer += tmp[x-1] * 3**i
    
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근 방식

  • 최대 공약수 :  두 수 이상의 여러 수의 공약수 중 최대인 수 -> n과 m에 동시에 나눠지는 i 중 가장 큰 값
  • 최소 공배수 :  두 수 이상의 여러 수의 공배수 중 최소인 수 -> n과 m을 곱한 값을 최대 공약수로 나눈 값 (유클리드 호제법)
  • 더 쉬운 방법 : math 패키지 활용
import math

math.gcd(a, b)
math.lcm(a, b)

 

3. 코드

def solution(n, m):
    answer = [1, 0]
    
    # GCD
    for i in range(1, m+1):
        if n%i ==0 and m%i==0:
            answer[0] = i
            
    # LCM
    answer[1] = n * m // answer[0]

    return answer

 

4. 결과

728x90
반응형
728x90
반응형

프로그래머스 SQL 고득점 Kit 

 

프로그래머스

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

programmers.co.kr

-- 1. 모든 레코드 조회하기
SELECT * from animal_ins order by animal_id asc

-- 2. 역순 정렬하기
SELECT Name, datetime from animal_ins order by animal_id desc

-- 3. 아픈 동물 찾기
SELECT animal_id, name from animal_ins where intake_condition = "Sick" order by animal_id asc ;

-- 4. 어린 동물 찾기
SELECT animal_id, name from animal_ins where not intake_condition = "aged" order by animal_id ASC

-- 5. 동물의 아이디와 이름
SELECT animal_id, name from animal_ins order by animal_id asc

-- 6. 여러 기준으로 정렬하기
SELECT animal_id, name, datetime from animal_ins order by name asc, datetime desc

-- 7. 상위 n개 레코드
SELECT name from animal_ins order by datetime asc limit 1

 


 

프로그래머스

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

programmers.co.kr

-- 1. 최댓값 구하기
SELECT datetime from animal_ins order by datetime desc limit 1

-- 2. 최솟값 구하기
SELECT min(datetime) from animal_ins

-- 3. 동물 수 구하기
SELECT count(animal_id) from animal_ins;

-- 4. 중복 제거하기
SELECT distinct(name) from animal_ins

 


 

프로그래머스

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

programmers.co.kr

-- 1. 고양이와 개는 몇마리 있을까
SELECT animal_type, count(animal_id) as count from animal_ins group by animal_type order by animal_type asc

-- 2. 동명 동물 수 찾기
SELECT name, count(name) as count from animal_ins group by name having count(name) >= 2 order by name asc

-- 3. 입양 시작 구하기 (1)
select HOUR(datetime) as hour, count(datetime) as count 
from animal_outs 
group by hour having hour >= 9 and hour < 20
order by hour asc

-- 4. 입양 시각 구하기 (2)
SET @h = -1;
SELECT (@h := @h + 1) as hour,
(select count(hour(datetime)) from animal_outs where hour(datetime) = @h) as count
from animal_outs where @h < 23

 


 

프로그래머스

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

programmers.co.kr

-- 1. 이름이 없는 동물의 아이디
SELECT animal_id from animal_ins where name is NULL

-- 2. 이름이 있는 동물의 아이디
SELECT animal_id from animal_ins where name is not null order by animal_id asc

-- 3. NULL 처리하기
SELECT animal_type, ifnull(name, "No name") as name, sex_upon_intake from animal_ins;

 


 

프로그래머스

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

programmers.co.kr

-- 1. 없어진 기록 찾기
SELECT outs.animal_id, outs.name from animal_outs outs
left outer join animal_ins ins
on outs.animal_id = ins.animal_id
where ins.animal_id is null
order by outs.animal_id asc

-- 2. 있었는데요 없었습니다
SELECT ins.animal_id, ins.name from animal_ins ins
join animal_outs outs on ins.animal_id = outs.animal_id
where ins.datetime > outs.datetime
order by ins.datetime asc

-- 3. 오랜 기간 보호한 동물 (1)
select ins.name, ins.datetime from animal_ins ins
left join animal_outs outs 
on ins.animal_id = outs.animal_id
where outs.animal_id is null
order by ins.datetime asc
limit 3

-- 4. 보호소에서 중성화한 동물
SELECT ins.animal_id, ins.animal_type, ins.name from animal_ins ins
left join animal_outs outs
on ins.animal_id = outs.animal_id
where (outs.sex_upon_outcome like '%Spayed%' or outs.sex_upon_outcome like '%Neutered%')
and ins.sex_upon_intake like '%Intact%'
order by ins.animal_id asc

 


 

프로그래머스

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

programmers.co.kr

-- 1. 루시와 엘라 찾기 
SELECT animal_id, name, sex_upon_intake from animal_ins
where name="Lucy" or name="Ella" or name="Pickle" or name="Rogan" or name="Sabrina" or name="Mitty"
order by animal_id asc

-- 2. 이름에 el이 들어가는 동물 찾기
SELECT animal_id, name from animal_ins
where lower(name) like "%el%" and animal_type = "Dog"
order by name asc

-- 3. 중성화 여부 파악하기
SELECT animal_id, name,
case when (SEX_UPON_INTAKE LIKE '%NEUTERED%' OR SEX_UPON_INTAKE LIKE '%SPAYED%')then 'O' else 'X' end
from animal_ins
order by animal_id asc

-- 4. 오랜 기간 보호한 동물 (2)
SELECT ins.animal_id, ins.name from animal_ins ins, animal_outs outs
where ins.animal_id = outs.animal_id
order by datediff(outs.datetime, ins.datetime) desc
limit 2

-- 5. DATETIME에서 DATE로 형 변환
SELECT animal_id, name, DATE_FORMAT(datetime, '%Y-%m-%d') as 날짜 from animal_ins
order by animal_id asc

 

728x90
반응형
728x90
반응형

1. 문제

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

 

코딩테스트 연습 - 네트워크

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

programmers.co.kr

 

2. 접근 방식

  • 입력 받은 인접 행렬에 몇개의 그래프가 존재하는지를 묻는 문제
  • BFS를 수행 후에도 방문하지 않은 노드가 남아 있다면 다른 그래프가 존재한다고 판단함 (방문하지 않은 노드가 없을 때까지 반복하여 탐색)
  • 인접 행렬 형식의 2차원 Vector를 인접리스트 형식으로 변경 후 BFS 수행

 

3. 코드

#include <cstring>
#include <vector>
#include <queue>

using namespace std;

void bfs(int start, vector<int> *graph, bool* visited){
    queue<int> q;
    int nowNode;
    
    q.push(start);
    visited[start] = true;
    
    while(!q.empty()){
        nowNode = q.front();
        q.pop();
        
        for(auto node : graph[nowNode]){
            if(!visited[node]){
                q.push(node);
                visited[node] = true;
            }
        }
    }
}

int solution(int n, vector<vector<int>> computers) {
    int answer = 0;

    vector<int> *computer = new vector<int>[n+1];
    
    for(int i=0; i < n; i++){
        for(int j=0; j < n; j++){
            if(computers[i][j] == 1 && i != j){
                computer[i+1].push_back(j+1);
            }
        }
    }
    
    
    bool *visited = new bool[n + 1];
    memset(visited, 0, sizeof(bool) * (n+1));

    for(int i=1; i<n+1; i++){
        if(!visited[i]){
            bfs(i, computer, visited);
            answer++;
        }
    }
    
    return answer;
}

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제 (레벨 2)

https://programmers.co.kr/learn/courses/30/lessons/43165

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수

programmers.co.kr

 

2. 접근 방식

  • BFS/ DFS 카테고리에 있는 문제지만, 해당 탐색 알고리즘으로 해결할 방법이 떠오르지 않아 완전탐색으로 구현
  • +, - 부호를 이진수로 표현하여 모든 경우에 대해 연산한 뒤 개수를 카운팅함
  • 통과는 했지만 메모리와 시간에 제한이 있다면 실패할 듯 함

 

3. 코드

def solution(numbers, target):
    answer = 0
    aa = pow(2, len(numbers))
    
    list_tmp = []
    list_arr = []
    
    for n in range(0, aa):
        tmp = n
        list_tmp = []
        
        while tmp > 0:
            list_tmp.append(tmp%2)
            tmp //= 2
            
        while len(list_tmp) < len(numbers):
            list_tmp.append(0)
         
        list_arr.append(list(reversed(list_tmp)))
        
        
    int_sum = 0    
    for tmp in list_arr:      
        int_sum = 0  
        
        for i in range(0, len(numbers)):
            if tmp[i]:
                int_sum += -1*numbers[i]
            else:
                int_sum += numbers[i]
        
        if int_sum == target:
            answer += 1
          
    
    return answer

 

4. 결과

 

728x90
반응형
728x90
반응형

1. 문제

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

 

코딩테스트 연습 - 단어 변환

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

programmers.co.kr

 

2. 코드

def dfs(begin, target, words, visited):
    str_end = target
    str_start = begin
    int_depth = 0
    arr_stack = [str_start]
    
    while arr_stack:
        str_top = arr_stack.pop()
        print(str_top)
        
        if str_top == target:
            return int_depth
        
        for i in range(len(words)):
            if visited[i] or words[i] == str_top:
                continue
        
            for _ in range(len(words[i])):
                count_tmp = 0
                for j in range(len(words[i])):
                    if [ch for ch in words[i]][j] == [ch for ch in str_top][j]:
                        count_tmp+=1 
                
                if (len(words[i])-1) == count_tmp:
                    visited[i] = True
                    
                    if words[i] != str_end:
                        arr_stack.append(words[i])
                    else:
                        return int_depth+1
                    break
                    
        int_depth += 1
            
            
def solution(begin, target, words):
    if target not in words:
        return 0
    
    visited = [False] * (len(words))
    print(words)
    return dfs(begin, target, words, visited)

 

3. 결과

테스트 결과

728x90
반응형
728x90
반응형

1. 문제
https://programmers.co.kr/learn/courses/30/lessons/42748

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

2. 코드

def solution(array, commands):
    answer = []
    
    for cmd in commands:
        answer.append((lambda i, j : sorted(array[i-1:j]))(cmd[0], cmd[1])[cmd[2]-1])
    
    return answer

 

3. 결과

728x90
반응형

+ Recent posts