반응형

 

 

function solution(id_list, report, k) {
    let members = {};
    for (const r of report) {
        const [ reporter, reportee ] = r.split(" ");
        if (members[reportee]) {
            if (!members[reportee][1].includes(reporter)) {
                members[reportee][0]++;
                members[reportee][1].push(reporter);
                members[reportee][1] = [ ...new Set(members[reportee][1])];     
            }
        } else {
            members[reportee] = [1, [reporter]];
        }
    }
    let answer = new Array(id_list.length).fill(0);
    return Object.entries(members).reduce((acc, curr) => {
        const [key, value] = curr;
        if (value[0] >= k) {
            for (const reportee of value[1]) {
                const idx = id_list.indexOf(reportee);
                if (idx !== -1) {
                    answer[idx]++;
                }
            }   
        }
        return acc;
    }, answer);
}

 

 

 

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

** Python

 

Christopher 님의 도움을 받음

 

def solution(skill, skill_trees):
    answer = 0
    for skill_tree in skill_trees:
        skill_t = [ s for s in skill_tree if s in skill]
        skt = ''.join(skill_t)
        if skill.find(skt) == 0: answer += 1
    return answer

 

 

 

 

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

월간코드챌린지 때 효율성에서 막혀서 결국 못 풀었는데 풀이 보고 너무나도 간단해서 놀랐다.

 

1차원 배열을 n 으로 나눈 몫, 나머지에서 max 값만 구하면 되다니..

 

** python

 

 

 

def solution(n, left, right):
    answer = []
    for i in range(left, right + 1):
        answer.append(max(divmod(i, n)) + 1)
    return answer

 

 

 

참고: https://sangsangss.tistory.com/197

 

[프로그래머스] n^2 배열 자르기

https://programmers.co.kr/learn/courses/30/lessons/87390 코딩테스트 연습 - n^2 배열 자르기 정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는..

sangsangss.tistory.com

 

반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 

** Python

 

코드 실행에서는 통과됐는데 채점에서 35퍼 나와서 뭐가 문제인가 했는데

 

질문하기에 방향성이 없어야 한다는 말에 깨달음

 

(1,1) -> (0,1) 이랑 (0,1) -> (1,1) 은 같은 길을 갔으므로 카운트 되면 안됨

 

 

 

def solution(dirs):
    answer = 0
    loc = [0, 0]
    strd = {'U': (0, 1), 'D': (0, -1), 'R': (1, 0), 'L': (-1, 0)}
    visited = set()
    for d in dirs:
        old_x = loc[0]
        old_y = loc[1]
        new_x = loc[0] + strd[d][0]
        new_y = loc[1] + strd[d][1]
        if new_x > 5 or new_x < -5 or new_y > 5 or new_y < -5:
            continue
        road1 = (old_x, old_y, new_x, new_y)
        road2 = (new_x, new_y, old_x, old_y)
        visited.add(road1)
        visited.add(road2)
        loc = [new_x, new_y]
    return len(visited) // 2

 

 

그래서 그냥 두 개 다 넣어버리고 2로 나눔 ㅋㅋㅋㅋ

 

 

 

 

 

 

다른 사람 풀이 보니까 방향성은 괜찮았던 것 같다

가장 추천 많이 받은 풀이랑 비슷해서 뿌듯

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

** Python

 

1) 1차 시도 (실패 73.3/100)

 

from datetime import timedelta

def replace_melody(melody):
    return melody\
    .replace('C#', 'Z')\
    .replace('D#', 'Y')\
    .replace('F#', 'X')\
    .replace('G#', 'W')\
    .replace('A#', 'V')

def cal_time_diff(start, end):
    start_hour, start_min = map(int, start.split(":"))
    start_time = timedelta(hours=start_hour, minutes=start_min)
    end_hour, end_min = map(int, end.split(":"))
    end_time = timedelta(hours=end_hour, minutes=end_min)
    return int((end_time - start_time).total_seconds() // 60)

def solution(m, musicinfos):
    temp = [[0, 999, ""]]
    for index, musicinfo in enumerate(musicinfos):
        start_time, end_time, name, melody = musicinfo.split(",")
        time_dur = cal_time_diff(start_time, end_time)
        re_m = replace_melody(m)
        re_melody = replace_melody(melody)
        div, mod = divmod(time_dur, len(re_melody))
        whole_music = re_melody * div + re_melody[0:mod] if len(re_melody) < time_dur else re_melody[0:mod]
        if re_m in whole_music:
            if temp[0][0] < time_dur:
                temp[0] = [time_dur, index, name];
            elif temp[0][0] == time_dur and temp[0][1] > index:
                temp[0] = [time_dur, index, name];
    if len(temp) > 0:
        return temp[0][2]
    return "(None)"

 

 

 

2) 2차 시도 (86.7/100)

 

 

from datetime import timedelta

def replace_melody(melody):
    return melody\
    .replace('C#', 'c')\
    .replace('D#', 'd')\
    .replace('E#', 'e')\
    .replace('F#', 'f')\
    .replace('G#', 'g')\
    .replace('A#', 'a')\
    .replace('B#', 'b')

def cal_time_diff(start, end):
    start_hour, start_min = map(int, start.split(":"))
    start_time = timedelta(hours=start_hour, minutes=start_min)
    end_hour, end_min = map(int, end.split(":"))
    end_time = timedelta(hours=end_hour, minutes=end_min)
    return int((end_time - start_time).total_seconds() // 60)

def solution(m, musicinfos):
    temp = [[0, 999, ""]]
    for index, musicinfo in enumerate(musicinfos):
        start_time, end_time, name, melody = musicinfo.split(",")
        time_dur = cal_time_diff(start_time, end_time)
        re_m = replace_melody(m)
        re_melody = replace_melody(melody)
        div, mod = divmod(time_dur, len(re_melody))
        whole_music = re_melody * div + re_melody[0:mod] if len(re_melody) < time_dur else re_melody[0:mod]
        if re_m in whole_music:
            if time_dur > temp[0][0]:
                temp[0] = [time_dur, index, name];
            elif time_dur == temp[0][0]:
                temp[0] = temp[0];
    if temp[0][1] == 999:
        return "(None)"
    return temp[0][2]

 

 

3) 3차 시도 (결국 구글링 ㅠ)

 

def replace_melody(melody):
    return melody\
    .replace('C#', 'c')\
    .replace('D#', 'd')\
    .replace('F#', 'f')\
    .replace('G#', 'g')\
    .replace('A#', 'a')

def cal_time_diff(start, end):
    start_hour, start_min = map(int, start.split(":"))
    start_time = start_hour * 60 + start_min
    end_hour, end_min = map(int, end.split(":"))
    end_time = end_hour * 60 + end_min
    return end_time - start_time

def solution(m, musicinfos):
    answer = []
    m = replace_melody(m)
    for idx, musicinfo in enumerate(musicinfos): 
        musicinfo = replace_melody(musicinfo)
        musicinfo = musicinfo.split(',')
        time = cal_time_diff(musicinfo[0], musicinfo[1])

        # 길이가 시간보다 더 긴 경우 
        if len(musicinfo[3]) >= time :
            melody = musicinfo[3][0:time]
        else:             
            # 시간을 계산해서 몫과 나머지로 계산 
            a, b = divmod(time, len(musicinfo[3]))
            melody = musicinfo[3] * a + musicinfo[3][0:b]
        # 노래가 melody에 포함되면 정답후보에 저장 
        if m in melody: 
            answer.append([idx, time, musicinfo[2]])
    # 정답이 있는 경우 
    if len(answer) != 0: 
        # time -> index 기준으로 정렬 
        answer = sorted(answer, key = lambda x: (-x[1], x[0]))
        return answer[0][2]
    # 정답이 없는 경우
    return "(None)"

참고: https://eda-ai-lab.tistory.com/506

 

[프로그래머스] [3차] 방금그곡/파이썬

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

eda-ai-lab.tistory.com

 

 

 

조건문에서 잘못됐었던 것 같다

 

 

 

반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

import re
def solution(files):
    reg = [re.split(r'(\d+)', s) for s in files]
    reg.sort(key = lambda x: (x[0].lower(), int(x[1])))
    return [''.join(s) for s in reg]

 

참고: https://velog.io/@sem/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LEVEL2-%ED%8C%8C%EC%9D%BC%EB%AA%85-%EC%A0%95%EB%A0%AC-Python

 

[프로그래머스] LEVEL2 파일명 정렬 (Python)

프로그래머스 알고리즘 풀이

velog.io

참고: https://stackoverflow.com/questions/430079/how-to-split-strings-into-text-and-number

 

How to split strings into text and number?

I'd like to split strings like these 'foofo21' 'bar432' 'foobar12345' into ['foofo', '21'] ['bar', '432'] ['foobar', '12345'] Does somebody know an easy and simple way to do this in python?

stackoverflow.com

 

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 

 

 

level 2 너무 어렵다,,

 

def solution(msg):
    dic = {}
    for i in range(26):
        dic[chr(65+i)] = i+1
    w = 0
    c = 0
    answer = []
    while True:
        c += 1
        if len(msg) == c:
            answer.append(dic[msg[w:c]])
            break
        if msg[w:c+1] not in dic:
            dic[msg[w:c+1]] = len(dic) + 1
            answer.append(dic[msg[w:c]])
            w = c
    return answer

참고: https://hazung.tistory.com/89

 

[알고리즘] 프로그래머스 압축 / python

https://programmers.co.kr/learn/courses/30/lessons/17684 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업

hazung.tistory.com

 

 

반응형
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

def solution(board):
    for i in range(1, len(board)):
        for j in range(1, len(board[i])):
            if board[i][j] == 1:
                board[i][j] = min(board[i-1][j-1], board[i-1][j], board[i][j-1]) + 1
    # print(board)
    answer = 0
    for b in board:
        lmax = max(b)
        answer = max(answer, lmax)
    return answer**2

참고: https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A0%95%EC%82%AC%EA%B0%81%ED%98%95-%EC%B0%BE%EA%B8%B0-%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-dp

 

[Python] 프로그래머스 level2 가장 큰 정사각형 찾기 (동적 프로그래밍, dp)

가장 큰 정사각형 찾기 문제는 동적 프로그래밍으로 풀지 않으면 효율성 테스트에서 통과되지 않는다! 처음에 동적 프로그래밍으로 풀어야 한다는 생각을 하기까지 시간이 좀 걸려서 그 과정까

velog.io

 

 

 

 

(0,0) 에서 (n,n) 방향으로 누적되는 것을 볼 수 있음

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 

** Python

 

def solution(people, limit):
    answer = 0
    people.sort()
    start, end = 0, len(people) - 1
    while start <= end:
        answer += 1
        if people[start] + people[end] <= limit:
            start += 1
        end -= 1
    return answer

 

 

반응형
반응형

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

** Python

 

def n_decimal(n, q):
    base = "0123456789ABCDEF" # 나올 수 있는 값
    n, mod = divmod(n, q)
    if n == 0:
        return base[mod]
    return n_decimal(n, q) + base[mod] # 나머지 index를 이용하여 string 더하기
def solution(n, t, m, p):
    answer = ''
    temp = ''
    for i in range(m * t): # 나올 수 있는 모든 string 개수 = m 명 * t 개
        temp += n_decimal(i, n)
    while len(answer) < t:
        answer += temp[p-1]
        p += m # m 명 다 돌고 튜브의 순서가 돌아옴
    return answer

참고: https://velog.io/@sem/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LEVEL2-n%EC%A7%84%EC%88%98-%EA%B2%8C%EC%9E%84-Python

 

 

 

 

 

반응형

+ Recent posts