반응형

 

 

 

안녕하세요

Henry's Alogirthm의 Henry 입니다.

 

오늘은 프로그래머스의 기능개발 문제를 풀어보았습니다.

 

문제 푸는 요령:

순서가 중요한 문제여서

배열의 인덱스를 중점적으로 활용해서 푸는 문제입니다.

"순서 -> 인덱스 활용"

 

for문으로 순차적으로 접근해주면서 비교 연산자를 통해 풀어주시면 됩니다.

 

아래는 저의 코드입니다.

 

import java.util.Arrays;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] dayOfend = new int[100];
        int day = 0; // 오늘 /  1 -> 하루 뒤
        
        for(int i=0; i<progresses.length; i++){
            while(progresses[i] + day*speeds[i] < 100){
                day ++;
            }
            
            dayOfend[day] ++;
        }
        
        return Arrays.stream(dayOfend).filter(i -> i != 0).toArray();
    }
}

 

 

그럼 오늘도 즐거운 코딩되세요~!ㅎㅎ

반응형
반응형

 

안녕하세요~!

 

Henry's Algorithm의 헨리입니다.

 

오늘은 자바로 문제를 풀어보았습니다.

 

문제 푸는 요령:

두개의 배열중에 하나만 딱 다를때,

정렬을 한 후에 동등비교를 통해서 문제를 풀 수 있게 됩니다.

 

아래 제가 푼 코드를 올려놓겠습니다.

 

다들 열공하시기 바랍니다.

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        for(int i=0; i<completion.length; i++){
            if(!completion[i].equals(participant[i])){
                return participant[i];
            }
        }
        
        answer = participant[participant.length - 1];
        
        return answer;
    }
}
반응형
반응형

 

 

안녕하세요 Henry입니다.

 

오늘은 회사 출근하기 전에 일찍 눈을 뜨게 되서

코딩 문제를 한문제 풀어보았습니다.

 

python의 dictionary라는 자료형은 정말 잘 사용하기만 한다면 

좋은 도구가 될 수 있는 것 같습니다.

 

이 문제를 풀 때에도

dictionary의 key, value 구조를 활용하여서 userid의 이름을 관리해주고,

마지막에key값을 통해 value값에 접근하면서 문제를 해결할 수 있었습니다.

 

다른 사람의 풀이를 보니 모두 비슷한 사고 과정으로 접근한 것 같습니다.

일단 userid에 대한 최종 name을 얻기 위해 for문 1번,

그리고 출력 구문을 생성해주기 위해 for문 1번을 돌아야하는 거는 다들 같은 생각을 한 것 같습니다.

 

아래는 저의 코드입니다.

 

def solution(record):
    answer = []
    records = [row.split(' ') for row in record]
    users: Dict[str, str] = {}
    
    for row in records:
        if row[0] == 'Enter':
            users[row[1]] = row[2]
            answer.append([row[1],'님이 들어왔습니다.'])
        elif row[0] == 'Change':
            users[row[1]] = row[2]
        elif row[0] == 'Leave':
            answer.append([row[1],'님이 나갔습니다.'])
        else:
            raise Exception
    
    
    return [users[i[0]]+i[1] for i in answer]

 

감사합니다.

반응형
반응형

 

안녕하세요

알고리즘 공부하는 Henry입니다.

 

오늘은 일요일 저녁 인데요,

저는 집 근처 투썸에 나와서 코딩 문제를 한 문제 풀어보았습니다.

요즘 제가 정보보안기사 시험을 준비하고 있어서, 기사시험 준비하다가 중간 중간에 쉴 겸, 프로그래머스 Level 1짜리 코딩 문제를 풀어보았습니다.

 

오늘 제가 푼 문제는 2021년도 카카오 채용연계형 인턴십에서 출제된 숫자 문자열과 영단어라는 문제입니다.

 

Python의 딕셔너리를 활용해서 풀면 쉽게 풀리는 문제였습니다.

아래는 제가 문제를 푼 코드인데, 한번 100점을 받게 되서, 뿌듯했습니다.

비록 Level 1의 쉬운 문제이지만, 이렇게 꾸준히 공부하다보면 사고력도 좋아지고, 나중에 반드시 도움이 될 것 이라 생각합니다.

 

def solution(s):
    answer = ''
    number_dictionary = {'zero': '0', 'one': '1', 'two': '2',
                         'three': '3', 'four': '4', 'five': '5',
                         'six': '6', 'seven': '7', 'eight': '8',
                         'nine': '9', '': ''}
    current_str = ''
    for i in s:
        if i not in number_dictionary.values():
            current_str += i
            if current_str in number_dictionary:
                answer += number_dictionary[current_str]
                current_str = ''
        else:
            answer += i
    answer += number_dictionary[current_str]
    
    return int(answer)

 

열심히 공부하고 꾸준히 노력해서

앞으로 한국에서 코딩 문제를 가장 잘 푸는 개발자가 되고 싶습니다!

 

 

https://youtu.be/ZiLqpIP-zHs

 

반응형
반응형

 

안녕하세요~

개발자 Henry입니다!

 

오늘은 날씨가 무지 더웠던 하루였는데요,

이런 날씨에는 집에서 시원한 에어컨 바람에 코딩 문제를 풀며 시간을 보내는 게 좋은 것 같습니다ㅎㅎ

오늘 제가 풀어본 문제는 프로그래머스에서 카카오 인턴 코딩테스트용으로

나왔던 문제입니다.

 

이름하여, 키패드 누르기!

 

문제는 다음과 같습니다.

 

더보기

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

입출력 예

numbershandresult

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL"
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR"
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

입출력 예에 대한 설명

입출력 예 #1

순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.

왼손 위치오른손 위치눌러야 할 숫자사용한 손설명

* # 1 L 1은 왼손으로 누릅니다.
1 # 3 R 3은 오른손으로 누릅니다.
1 3 4 L 4는 왼손으로 누릅니다.
4 3 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 3 8 L 왼손 거리는 1, 오른손 거리는 3이므로 왼손으로 8을 누릅니다.
8 3 2 R 왼손 거리는 2, 오른손 거리는 1이므로 오른손으로 2를 누릅니다.
8 2 1 L 1은 왼손으로 누릅니다.
1 2 4 L 4는 왼손으로 누릅니다.
4 2 5 R 왼손 거리와 오른손 거리가 1로 같으므로, 오른손으로 5를 누릅니다.
4 5 9 R 9는 오른손으로 누릅니다.
4 9 5 L 왼손 거리는 1, 오른손 거리는 2이므로 왼손으로 5를 누릅니다.
5 9 - -  

따라서 "LRLLLRLLRRL"를 return 합니다.

입출력 예 #2

왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.

입출력 예 #3

오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.

 

 

 

프로그래머스에서 Level 1 문제여서 가벼운 마음으로 풀어나갔습니다.

 

처음에는 최단경로 문제처럼 보였지만,

실제로는 Dictionary를 만들어 시간복잡도 n(1)의 방법으로 접근할 수 있었습니다.

 

아래는 제가 푼 코드입니다.

def solution(numbers, hand):
    _dict = {'1':{'2': 1, '5': 2, '8': 3, '0': 4},
             '2':{'2': 0, '5': 1, '8': 2, '0': 3},
             '3':{'2': 1, '5': 2, '8': 3, '0': 4},
             '4':{'2': 2, '5': 1, '8': 2, '0': 3},
             '5':{'2': 1, '5': 0, '8': 1, '0': 2},
             '6':{'2': 2, '5': 1, '8': 2, '0': 3},
             '7':{'2': 3, '5': 2, '8': 1, '0': 2},
             '8':{'2': 2, '5': 1, '8': 0, '0': 1},
             '9':{'2': 3, '5': 2, '8': 1, '0': 2},
             '0':{'2': 3, '5': 2, '8': 1, '0': 0},
             '*':{'2': 4, '5': 3, '8': 2, '0': 1},
             '#':{'2': 4, '5': 3, '8': 2, '0': 1}
            }
    answer = ''
    _right_hand = '#'
    _left_hand = '*'
    for i in numbers:
        if i in [1,4,7]:
            _left_hand = str(i)
            answer += "L"
        elif i in [3,6,9]:
            _right_hand = str(i)
            answer += "R"
        else:
            if _dict[_right_hand][str(i)] > _dict[_left_hand][str(i)]:
                _left_hand = str(i)
                answer += "L"
            elif _dict[_right_hand][str(i)] < _dict[_left_hand][str(i)]:
                _right_hand = str(i)
                answer += "R"
            else:
                if hand == "right":
                    _right_hand = str(i)
                    answer += "R"
                else:
                    _left_hand = str(i)
                    answer += "L"
            
    return answer

 

 

거의 노가다로 풀었다고 할 수 있는데요,

실제로 이렇게 푸신 분들도 여럿 계시다고 하시더라구요!

 

저는 메모리를 많이 사용해서 풀게 되었는데,

변수를 잘 활용하시면 저처럼 메모리 공간을 많이 쓰지 않고도 푸실 수 있다고 하시니,

참고해보시면 좋을 것 같습니다.

 

 

그럼 오늘은 여기까지 하겠습니다.

 

다들 편안한 밤 되세요~

 

 

https://www.youtube.com/watch?v=ViLh8HtdsGY 

 

반응형
반응형

 

안녕하세요~!

알고리즘을 공부하는 개발자 Henry입니다~

 

오늘은 프로그래머스의 폰켓몬이라는 문제를 풀어보았습니다.

프로그래머스의 Level 1에 있는 비교적 난이도가 낮은 문제입니다!

 

저의 코드입니다!

def solution(nums):
    answer = 0
    _len = len(nums)
    distinct_len = len(set(nums))
    
    if distinct_len >= _len//2:
        return _len//2
    else:
        return distinct_len
            
    return answer

문제가 매우 길어서 생각보다 까다롭지 않을까 걱정했었는데,

막상 풀어보니 의외로 몇줄 안에 끝나는 문제였습니다!

 

한번에 문제를 맞출 수 있어서 감사했습니다.

다중 for문으로 접근해야하나 싶었는데,

문제를 제대로 읽어보니, 단순 조건문으로 해결 가능한 문제였습니다ㅎㅎ

 

 

요즘에 알고리즘을 하나씩 제대로 공부해서

점차 Level 3도 잘 풀 수 있는 개발자가 되어야겠습니다!

 

아래에 제가 문제를 해설한 영상을 달아놓으니, 어려우신 분들은 도움 받으실 수 있을 것 같습니다!ㅎㅎ

https://youtu.be/Sa4oWrwJs8o

 

반응형
반응형

 

안녕하세요~~!!ㅎㅎ

알고리즘을 공부하는 개발자 Henry입니다!

 

오늘은 프로그래머스의 "신규 아이디 추천" 이라는 문제를 풀어보았습니다!

 

2021 카카오 블라인드 채용 코딩테스트에 출제되었던 문제인데요,

카카오 치고는 쉬운 난이도여서 모두 어려움 없이 푸실 수 있었을 것 같습니다!

 

아래는 제가 문제를 푼 코드입니다.

def solution(new_id):
    import re
    answer = ''
    new_id = new_id.lower() # 1 단계
    new_id = re.sub(r"[^a-z0-9-_.]","",new_id) # 2 단계
    while new_id.replace("..",".") != new_id:
        new_id = new_id.replace("..",".") # 3 단계
    
    # 4 단계
    while len(new_id) > 0 and new_id[0] == ".": 
        new_id = new_id[1:]
    while len(new_id) > 0 and new_id[-1] == ".":
        new_id = new_id[:-1]
    
    # 5 단계
    if new_id == "":
        new_id += "a"
    # 6 단계
    if len(new_id) >= 16:
        new_id = new_id[:15]
        while new_id[-1] == ".":
            new_id = new_id[:-1]
    # 7 단계
    while len(new_id) < 3:
        new_id += new_id[-1]
           
    return new_id

 

문제에서 여러가지 단계를 나열해주고 있는데,

해당 단계들을 코드로만 정확하게 변환해주면 되는 쉬운 문제였습니다.

 

Level 1문제를 이렇게 큰 어려움 없이 풀 수 있는데,

아직 Level 2~3에는 관련 알고리즘 방법들을 빠르게 파악하는 것과,

정확한 알고리즘 원리를 이해하는 것이 선행되어야 할 것 같다는 생각을 하였습니다.

 

아래는 제가 문제를 설명한 영상입니다!

https://youtu.be/WlAGJjrcKkA

 

 

앞으로도 열심히 공부해야겠습니다!ㅎㅎ

다들 화이팅!

반응형
반응형

 

 

안녕하세요

알고리즘을 좋아하는 개발자 Henry입니다!ㅎㅎ

 

최근에 회사를 다니면서 바쁘고 피곤해서 코딩 문제를 못풀었었는데,

다시 조금씩 풀어보려고 키보드를 잡았습니다!

 

오늘은 프로그래머스에서 동적계획법을 사용해서 푸는 문제를 풀어보았습니다.

N으로 표현이라는 문제를 처음 접했을 때,

아래와 같이 풀었습니다.

 

def solution(N, number):
    answer = 0
    li = []
    dynamic(N,N,number, li, 1)
    return min(li) if len(li) != 0 else -1

def dynamic(N, cur, number, li, cnt):
    if cnt > 8:
        return
    if number == cur:
        li.append(cnt)
        return
    dynamic(N, int(str(cur)+str(N)), number, li, cnt+1) # N->N
    dynamic(N, cur+N, number, li, cnt+1) # N -> +
    dynamic(N, cur-N, number, li, cnt+1) # N -> -
    dynamic(N, cur//N, number, li, cnt+1) # N -> // 소수점은 무시하기 때문에
    dynamic(N, cur*N, number, li, cnt+1) # N -> *

 

 

그러나 위의 코드는 정확도 55점을 받았습니다.

 

알고보니 사칙연산에서 곱셈과 나눗셈을 먼저 계산을 해주는 로직이 빠져 있었습니다.

 

동적계획법을 사용해서 문제를 풀지 않아서 발생하는 이유였습니다.

여기서 잠깐!동적 계획법이란??>> 동적 계획법은 문제를 풀 때 하나의 문제를 여러 하위 문제로 나누어 풀고, 그것들을 결합해서 최종 목적에 도달하는 방식의 알고리즘입니다.

 

찾아보니까 아래의 링크에서 자세하게 설명해주고 있습니다.https://velog.io/@chelsea/1-%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming-DP

 

[자료구조와 알고리즘] 동적 계획법(Dynamic Programming, DP)

동적 계획법(Dynamic Programming) - 컴퓨터 공학 스터디 W1 자료구조와 알고리즘 내용에 앞서 학교에서 컴퓨터 공학 이론 스터디를 진행하고 있습니다. 매주 발표하는 내용을 시리즈로 업로드할 예정

velog.io

 

 

사실 동적계획법에 대해서 정확한 개념을 모르고 있었다.

 

큰 문제를 작게 쪼개어 작은 문제들을 풀어나가는 느낌으로만 이해하고 있었는데,위의 글을 통해서 동일한 작은 문제를 한번씩만 계산하는 원리가 숨어있다는 것을 알게 되었다.

 

그러나 바로 코드에 적용하는 것은 쉽지 않았다.그래서 몇번 고민한 결과 결국 구글링의 도움을 받아 아래 사이트와 동일한 방법으로 문제를 풀게 되었다.

 

https://gurumee92.tistory.com/164

 

프로그래머스 문제 풀이 N으로 표현

이 문제는 이시윤 강사님의 프로그래머스 강좌 "파이썬을 무기로, 코딩테스트 광탈을 면하자!"를 보고 정리한 내용입니다. 문제 URL N으로 표현 Contents 문제 지문 파악하기 강사님의 알고리즘 풀

gurumee92.tistory.com

def solution(N, number):
    answer = -1
    if number == N:
        return 1
    
    _li = [set() for i in range(8)]
    for i in range(len(_li)):
        _li[i].add(int(str(N)*(i+1)))
        
    for i in range(1,8):
        for j in range(i):
            for op1 in _li[j]:
                for op2 in _li[i-j-1]:
                    _li[i].add(op1+op2)
                    _li[i].add(op1-op2)
                    _li[i].add(op1*op2)
                    if op2 != 0:
                        _li[i].add(op1//op2)
        if number in _li[i]:
            answer = i+1
            break
    
    return answer

 

 

이번 기회를 통해서 동적계획법에 대해서 조금 더 알게 된 것 같아서 감사했다.

앞으로도 꾸준히 코딩 문제를 풀고 싶고, 알고리즘 공부를 하고 싶다.

 

 

반응형

+ Recent posts