본문 바로가기

Algorithm

(8)
[프로그래머스 LV.3] 베스트앨범 오래간만에 코딩테스트 문제를 한번 풀어보았다. 알고리즘 문제인데 해시는 그나마 풀만할 것 같아서 도전해보았는데,,, 역시 쥐약이다 하여튼 풀어냈는데 코드가 너무 더러운 것 같다,, 날 잡고 더욱 쉽고 깔끔하게 풀어낼 수 있도록 노력 해봐야겠다. 문제 딱봐도 dictionary 문제인 것 같다. 각 장르의 총합, 각 index 별 재생 횟수를 dictionary로 구분하여 저장해서 풀어야겠다 라는 생각부터 했다. 입출력 예 풀이 일단 각 장르의 총합, 장르의 idx와 재생 횟수를 추가하는 dictionary를 만들었다. 각 장르와 idx를 구분할 수 있도록 "/"를 넣어 'genre/idx' 를 key값으로, 재생횟수를 value로 넣었다. 이 부분을 따로 만들어버리지 않고 각 장르의 총합, 각 idx와 ..
[프로그래머스 LV.1] 개인정보 수집 유효기간 오래간만에 프로그래머스 알고리즘 문제를 풀어봤다. 맨날 JAVA만 사용해서 개발하다 알고리즘만은 Python을 놓치기 힘들어 Python으로 풀어봤는데 세미콜론과 괄호가 자동으로 들어가는건 기분탓인가? 그래도 아직은 머리가 돌아가나 보다... 생각외로 빠르게 풀어냈다.(나름의 구글링을 사용했지만 말이다.) 풀이를 시작해보자. 문제 문제가 꽤나 길다.. 그래도 이해하기는 충분히 쉬운 문제인 것 같다는 생각이였다. 입출력 예 풀이 나는 날짜라는 개념을 보자마자 Python의 Datetime을 가장 먼저 생각하게 되었다. 하지만, 변수가 하나 존재했다. 너무 큰 변수이다 보니 일부러 사진은 크게 해두겠다. 왜 변수이냐면, Datetime을 사용하면 매 달의 마지막 달은 실제 달의 마지막 날과 같게 출력될 것이..
[프로그래머스(LV2), JAVA]오픈채팅방 문제를 보자 문제가 너무 길다.... 근데 단순한 문제라 생각이 들었는데, 약간에 트릭이 있어보였다. 닉네임을 바로 출력해 주는 것이 아닌, uid에 따라 이름을 설정해 주면 되지 않을까 했다. 한번 내가 생각한 알고리즘을 보자. 채팅을 넣을 List와 uid를 키값으로, name을 value값으로 하는 Map을 만든다. for문을 사용해 입력값(record)을 하나씩 받아 StringTokenizer를 사용하여 entrance, uid, name으로 나누었다. → 여기서 record는 "entrance uid name" 으로 이루어진 값들을 얘기한다. 여기서 주의할 점은 Leave가 나온다면 어차피 등록된 uid이기 때문에 따로 name을 지정해 주지 않아도 된다. (Change는 name을 등록하는 ..
[프로그래머스(LV2), JAVA]문자열 압축 문제를 보자 입력받은 문자열이 연속된 숫자만큼 앞에 숫자를 적고 뒤에 연속된 문자열을 넣어주는 식의 문제이다. 중복된 문자열을 삭제하고, 연속된 만큼 숫자를 적어주면 가장 짧은 길이의 문자열이 되는데, 그 길이를 반환해주면 된다. 예시를 보자. 입력값 #2 에서 "ababcdcdababcdcd"는 총 16자리의 문자로, 8개의 문자로 잘라주면 ababcdcd가 2번 연속나오기 때문에 "2ababcdcd"가 되어 총 길이가 9인 문자열이 된다. 그러면 어떻게 풀어나가면 좋을까? 일단, 하나부터 문자열의 길이의 반만큼까지 문자열을 잘라 비교해본다. 만약 입력값 #2를 예시로 들면, 1개의 문자로 나누어 버리면 다음 b와 비교 후 그 다음 a를 다시 그 다음 값과 비교해야 한다. 그렇기에 다음 시작값에 문자를..
[프로그래머스(Lv2), JAVA]두 큐 합 같게 만들기 지금까지 백준만 풀어오다가 프로그래머스가 좋다는 말에 한걸음에 풀어봤다. 시작부터 Lv2문제를 풀어보았다. 주변에서 Lv2문제도 어렵다 하는데 진짜로 너무 어려웠다. 문제를 보자마자 무슨소리를 하는지... 그래도 도전해 보았다. 문제를 보자. 두개의 배열이 입력값으로 주어지는데, 각각 배열의 합이 같아야 하고, 한번 이동할때마다 count를 1씩 올려주면 되겠다 싶었다. 큐의 성질은 어차피 FIFO 형태로 맨 앞에서만 나가기 때문에 앞에서부터 옮겨주며 합을 비교해주고, 합이 큰 부분에서 가장 앞에 있는 값을 빼 합이 작은 배열로 이동시켜 다시 크기를 비교해보는 방법밖에 생각이 나지 않았다. 적혀져 있는 예를 보자. queue1 = [3, 2, 7, 2] 로 합이 14, queue2 = [4, 6, 5, ..
[JAVA]백준 1157 - 단어 공부 백준의 1157번 문제 단어 공부이다. 문제는 문자열이 주어지는데, 가장 많이 사용되는 알파벳이 무엇인지 알아내면 되겠다. 그 중 가장 눈에 띄는 부분은 "단, 대문자와 소문자를 구분하지 않는다."이다. 이를 보고 모든 문자를 대문자나 소문자로 변경하여 푼다면 쉽게 풀리지 않을까? 라는 생각을 했다. 문자의 코드값을 안다면 충분히 쉽게 풀릴 문제이다. 시작해보자. 1. 가장 먼저 알파벳들의 인덱스의 갯수가 추가될 int형 배열 arr을 추가한다. 어차피 가장 많은 값을 출력시키기 때문에 초기화는 0으로 해주었다. 2. 입력받은 모든 문자를 대문자화 시켜주었다. 소문자와 대문자는 구분하지 않고 알파벳의 갯수만 센다 했으니 대소문자는 굳이 필요가 없어 모두 대문자로 진행했다. 충분히 소문자로도 진행 가능하지..
[JAVA]백준 1065 - 한수 백준의 1065번 문제인 한수이다. 입력받은 값보다 작거나 같은 한수의 개수를 출력하는 것이 목표이다. 입력값 n을 넣고, 한수를 구하는 메서드를 만들어 출력하면 되겠다 라는 생각을 했다. 한수를 구할 때 1 ~ 99까지의 숫자는 모두 한수이다. → 어차피 1의자리 숫자와 10의 자리 숫자는 어차피 어떻게 해도 차이가 같이 때문이다. 100의 자리 숫자부터 각 자리 숫자마다 등차를 구해야 하는데, 1의자리와 10의자리의 차 / 10의자리와 100의자리의 차 를 구해보았다. 한수를 구할 수 있는 메서드에는 한수를 담을 수 있는 ArrayList와 각 자리 숫자를 담을 수 있는 int형 배열을 생성했다. 어차피 1000 이전까지만 숫자를 구하는 것이기 때문에 100의자리 숫자까지만 담을 수 있도록 int[3..
[JAVA]백준 4673 - 셀프 넘버 백준의 4673번 문제인 셀프넘버이다. 10000 이하의 생성자가 없는 숫자를 출력하는 것이 목표이다. 입력은 없고 출력만 있다. 이로 인해 숫자 N값을 넣어 출력시키면 된다 생각했다. 일단 생성자를 구할 수 있는 메서드를 어떻게 구현할지 생각을 해 보았는데, 첫번째로 10,000 이하의 정수만 생각한다 하여 1000의 자리 숫자, 100의자리 숫자, 10의자리 숫자, 1의자리 숫자를 구할 수 있는 방법을 생각했다. 1000의 자리 숫자 : 입력된 값에 1000을 나눈 몫 100의 자리 숫자 : 입력된 값에 100을 나누어 나온 몫에 10을 나누어 나온 나머지 10의 자리 숫자 : 입력된 값에 10을 나누어 나온 몫에 10을 나누어 나온 나머지 1의 자리 숫자 : 입력된 값에 10을 나누어 나온 나머지 ..