728x90

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

 

코딩테스트 연습 - H-Index

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

programmers.co.kr

출처 : 프로그래머스


def solution(citations):
    citations.sort(reverse = True)
    print(citations)
    
    for idx, cita in enumerate(citations):
        print(idx, cita)
        if idx >= cita:
            return idx
    return len(citations)

풀이

내림차순으로 정렬하고 idx랑 값을 같이 출력해본다.

그릐고 문제를 이해해보면 쉽게 풀 수 있다.

728x90

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

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr

from collections import deque

def solution(maps):
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    n = len(maps)
    m = len(maps[0])
    visited = [[-1]*m for _ in range(n)]
    q = deque()
    q.append([0,0])
    visited[0][0] = 1
    
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0<=nx<n and 0<=ny<m and maps[nx][ny] == 1: # 벽이 없으면
                if visited[nx][ny] == -1: 
                    visited[nx][ny] = visited[x][y] + 1
                    q.append([nx,ny])       
    return visited[-1][-1]

풀이

bfs 를 사용해서 푸는 간단한 풀이다.

다만, 최단경로의 최소값을 구해야되는데, 도달하지 못하면 -1을 리턴해야하니까

처음에 visited 방문처리 초기값을 평소 주던 0이 아닌 -1로 준다.

728x90

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

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

출처 : 프로그래머스


def solution(s):
    stack = []
    for i in s:
        if len(stack) == 0:
            stack.append(i)
        elif stack[-1] == i:
            stack.pop()
        else:
            stack.append(i)
    if len(stack) == 0:
        return 1
    else:
        return 0

풀이

문자열 s를 하나씩 비교해서 같은 문자가 2개 있으면 없애주고, 아니면 남기는 것을 반복적으로 해야한다.

 

stack 자료구조를 사용했다.

문자열 s에서 문자 하나씩을 stack에 넣어준다.

stack에 맨 위 문자랑 넣으려는 문자가 같으면 연속 2개가 같으니 pop해서 없애준다.

같지 않거나 stack이 비었으면 추가해준다.

728x90

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

 

코딩테스트 연습 - 피보나치 수

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) =

programmers.co.kr

출처 : 프로그래머스


def solution(n):
    answer = [0,1]
    for i in range(2, n+1):
        answer.append((answer[i-1]+answer[i-2]) % 1234567)
    return answer[-1]

풀이

n이 0, 1 일 때만 0, 1 이다.

이 값을 answer 에 삽입해주고, n 이 2이상일 때 피보나치 수열로 구한 값을 1234567로 나눈 나머지를 answer에 삽입한다.

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr


from collections import deque

def bfs(p):
    start = [] # P(사람) 마다 bfs해야함
    
    for i in range(len(p)):
        for j in range(len(p)):
            if p[i][j] == "P":
                start.append((i,j))
    # start p좌표마다
    for s in start:
        q = deque()
        q.append(s) # 큐에 시작 p좌표 삽입
        visited = [[0]*5 for _ in range(5)]
        distance = [[0]*5 for _ in range(5)]
        visited[s[0]][s[1]] = 1 # 처음 p좌표 방문처리
    
        while q:
            x, y = q.popleft()
            dx = [-1, 1, 0, 0]
            dy = [0, 0, -1, 1]
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0<=nx<5 and 0<=ny<5 and not visited[nx][ny]:
                    if p[nx][ny] == 'O': # 빈 책상이면
                        q.append((nx,ny))
                        visited[nx][ny] = 1 # 방문처리
                        distance[nx][ny] = distance[x][y] + 1 #거리 업데이트

                    elif p[nx][ny] == 'P':
                        distance[nx][ny] = distance[x][y]+1
                        if distance[nx][ny]<=2:
                            return 0
    return 1
                            
        
def solution(places):
    answer = []
    for i in places:
        answer.append(bfs(i))
    return answer

풀이

bfs로 풀이했다.

p(사람) 마다 주변에 p(사람) 이 맨해튼 거리가 2 이하인 거리에 있는지를 확인해야 한다.

파티션이 있으면 상하좌우 이동이 안 되는 것이고, O(빈 책상) 이 있으면 이동 가능하다.

p마다 bfs를 수행해야 하니, p의 좌표를 모두 start에 넣어서 관리한다.

 

 

.

이는 나중에 다시 풀어보도록 하자.

728x90

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

 

출처 : 프로그래머스

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr


import math
def solution(progresses, speeds):
    answer = []
    result = []
    for i in range(len(progresses)):
        answer.append((math.ceil((100-progresses[i]) / speeds[i])))
        
    tmp = answer[0]
    cnt = 1
    for i in range(1,len(answer)):
        if tmp < answer[i]:
            result.append(cnt)
            cnt = 1
            tmp = answer[i]
        else:
            cnt += 1
    result.append(cnt)
    
    return result

풀이

math.ceil() 을 사용해 시간을 올림해줬다.

728x90

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

출처 : 프로그래머스


def solution(record):
    answer = []
    # userid : nickname 관리
    users = {}
    for records in record:
        rec = records.split()
        if len(rec) == 3:
            users[rec[1]] = rec[2]
            
    # 최종적으로 보게되는 메시지
    for records in record:
        rec = records.split()
        if rec[0] == 'Enter':
            answer.append(users[rec[1]] + "님이 들어왔습니다.")
        elif rec[0] == 'Leave':
            answer.append(users[rec[1]] + "님이 나갔습니다.")
            
    return answer

풀이

명령어가 입력될 때마다 메시지가 출력되는 것이 아니고, 최종적으로 모두 변경된 후 메시지를 출력해야 한다.

user id가 중복되는 사람의 닉네임도 바뀐 최종 users 딕셔너리를 관리해야 한다.

user id가 중복되는 사람의 닉네임은 딕셔너리 키값으로 value를 덮어씌워준다.

+ Recent posts