중앙백 2021. 12. 8. 21:26

Programmers Level.2 오픈 채팅방

def solution(record):
    answer = []
    new_answer = []
    user_id = dict()
    for sentence in record:
        word = sentence.split()
        if word[0] == 'Enter':
            user_id[word[1]] = word[2]
            answer.append(word[1])
            answer.append("님이 들어왔습니다.")
        elif word[0] == 'Change':
            user_id[word[1]] = word[2]
        elif word[0] == 'Leave':
            answer.append(word[1])
            answer.append("님이 나갔습니다.")
    for i in range(len(answer)):
        if i % 2 == 0:
            new_answer.append(user_id[answer[i]])
        else:
            new_answer[-1] += answer[i]
    return new_answer

 - 아래는 다른 사람의 풀이. 내 방법보다 변수를 적게 설정할 수 있었다.

def solution(record):
    answer = []
    user_id = dict()
    printer = {'Enter':'님이 들어왔습니다.', 'Leave': '님이 나갔습니다.'}
    for sentence in record:
        word = sentence.split()
        if word[0] in ['Enter', 'Change']:
            user_id[word[1]] = word[2]
    for sentence in record:
        word = sentence.split()
        if word[0] != 'Change':
            answer.append(user_id[word[1]] + printer[word[0]])
    return answer

 

 

 

Programmers Level.2 멀쩡한 사각형

def solution(w,h):
    if w == 1 or h == 1:
        return 0
    answer = w * h
    array = [0] * (w+1)
    for i in range(w+1):
        array[i] = i * (h/w)
    for i in range(w):
        if array[i + 1] == round(array[i+1]):
            answer -= int(array[i+1]) - int(array[i])
        else:
            answer -= int(array[i+1]) - int(array[i]) + 1
    return answer

 - 틀림. x좌표가 정수 값을 가질 때를 기준으로 y값의 크기를 비교한다면 직선이 지나는 정수점 개수를 셀 수 있다고 생각했다. 아이디어 자체도 어느정도 수정해야겠지만 로직 자체의 문제보다는 시간초과가 뜨는게 제일 큰 문제라고 생각한다. 계산 횟수를 줄이기 가로와 세로의 최대공약수를 구해서 가로 세로 길이가 (가로/최대공약수 , 세로/최대공약수)인 사각형을 통해 전체 사각형에서의 값을 구하기로 아이디어 생각.

import math


def solution(w,h):
    if w == 1 or h == 1:
        return 0
    cnt = 0
    new_w = w // math.gcd(w, h)
    new_h = h // math.gcd(w, h)
    for i in range(new_w):
        if (i+1) * (h/w) == round((i+1) * (h/w)):
            cnt += int((i+1)*(h/w)) - int(i*(h/w))
        else:
            cnt += int((i+1)*(h/w)) - int(i*(h/w)) + 1
    return w*h - cnt * math.gcd(w,h)

 - 사실 애초부터 최대공약수 개념을 이용해서 풀 수 있다고 생각은 했는데, 굳이 그렇게 까지 해야하나 싶기도 해서 안했는데,,, 반성한다. 시간을 최소화하려는 마인드를 가져야겠다.

 

 

 

 

Programmers Level.2 124 나라의 숫자

def solution(n):
    answer = ''
    while n > 0:
        if n % 3 == 0:
            answer = '4' + answer
            n = n//3 -1
        else:
            answer = str(n%3) + answer
            n = n//3
    return answer

문제 풀이 아이디어

 - 일반적인 3진법 변환했던 것처럼 3으로 나누는 연산을 반복하되, 0이라는 개념이 없으므로 0이 나올때는 받아내림처럼 계산을 해준다. 왼쪽 그림에서 몫5 나머지 0일때, 몫을 4로 나머지를 3으로 바꿔준다. 그리고 최종적으로 3을 4로 바꿔주면 끝.

 

 - 아래는 다른 사람의 풀이

def solution(n):
    num = ['1','2','4']
    answer = ""
    while n > 0:
        n -= 1
        answer = num[n % 3] + answer
        n //= 3
    return answer

 

 

Programmers Level.2 기능개발

import math


def solution(progresses, speeds):
    days = []
    answer = []
    for progress, speed in zip(progresses, speeds):
        days.append(math.ceil((100 - progress) / speed))
    for day in days:
        if answer == [] or maxs < day:
            maxs = day
            answer.append(1)
        else:
            answer[-1] += 1
    return answer

 

 

 

Programmers Level.2 더 맵게

import heapq


def solution(scoville, K):
    hq = []
    answer = 0
    for i in scoville:
        heapq.heappush(hq, i)
    q1 = heapq.heappop(hq)
    while q1 < K:
        if hq == []:
            return -1
        q2 = heapq.heappop(hq)
        heapq.heappush(hq, q1 + q2*2)
        answer += 1
        q1 = heapq.heappop(hq)
        
    return answer

 

 

 

Programmers Level.2 타겟 넘버

def solution(numbers, target):
    global answer
    answer = 0
    def dfs(numbers,target):
        global answer
        if len(numbers) == 1:
            if numbers[0] == target or numbers[0] == -target:
                answer += 1
        else:
            dfs(numbers[1:], target+numbers[0])
            dfs(numbers[1:], target-numbers[0])
    dfs(numbers, target)
    return answer

 - 처음으로 푸는 dfs&bfs문제다. 그러다보니까 많이 어색한 듯.. 

 

 

Programmers Level.2 짝지어 제거하기

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

 - 문제를 잘못 이해한 상태로 풀어서 시간 엄청 걸렸다.............. 2개씩 짝지어서 버리는게 아니라 2개 이상을 짝지어서 버리는 걸로 잘못봐서 엄청 시간을 소비했다.

 

 

Programmers Level.2 행렬 테두리 회전하기

import copy

def solution(rows, columns, queries):
    answer = []
    graph = [[i*columns + j + 1 for j in range(columns)] for i in range(rows)]
    for query in queries:
        a,b,c,d = query
        a -= 1
        b -= 1
        c -= 1
        d -= 1
        new_graph = copy.deepcopy(graph)
        mins = 10001
        for i in range(a, c+1):
            for j in range(b, d+1):
                if i in range(a+1,c) and j in range(b+1, d):
                    continue
                if i == a and j > b:
                    new_graph[i][j] = graph[i][j-1]
                if i == c and j < d:
                    new_graph[i][j] = graph[i][j+1]
                if j == b and i < c:
                    new_graph[i][j] = graph[i+1][j]
                if j == d and i > a:
                    new_graph[i][j] = graph[i-1][j]
                if graph[i][j] < mins:
                    mins = graph[i][j]
        graph = copy.deepcopy(new_graph)
        answer.append(mins)
        print(graph)
    return answer

 - 시간초과가 났다. 회전 전의 graph와 후의 new_graph, 두 가지를 써서 그런 것 같다. 하나의 graph로만 구상하자.

def solution(rows, columns, queries):
    answer = []
    graph = [[i*columns + j + 1 for j in range(columns)] for i in range(rows)]
    for query in queries:
        a,b,c,d = query
        a -= 1
        b -= 1
        c -= 1
        d -= 1
        num = graph[a][b]
        mins = graph[a][b]
        for i in range(a,c):
            graph[i][b] = graph[i+1][b]
            if graph[i][b] < mins:
                mins = graph[i][b]
        for i in range(b,d):
            graph[c][i] = graph[c][i+1]
            if graph[c][i] < mins:
                mins = graph[c][i]
        for i in range(c, a,-1):
            graph[i][d] = graph[i-1][d]
            if graph[i][d] < mins:
                mins = graph[i][d]
        for i in range(d,b+1,-1):
            graph[a][i] = graph[a][i-1]
            if graph[a][i] < mins:
                mins = graph[a][i]
        graph[a][b+1] = num
        answer.append(mins)
    return answer

 

 

** 확실히 Level.2 가 되니까 난이도가 상승했다. 어렵다..