본문 바로가기

PS

(224)
문자열 압축 [프로그래머스] 1) 문제 접근 방법 - 2) 소스 코드 import java.util.*; class Solution { public int solution(String s) { int answer = Integer.MAX_VALUE; int len = s.length(); for(int i=1; i= len){ break; } if(end > len){ end = len; } String tmp = s.substring(start, end); strs.add(tmp); start += i; end += i; } int cnt = 1; for(int j=1; j
괄호변환 [프로그래머스] 1) 문제 접근 방법 - 문제의 조건에 따라, 재귀함수를 구현해서 문제를 해결했다. - 문자열 w를 두 균형잡힌 문자열 u, v로 분리해야 하는데, 이 때, open과 close의 길이가 일치할 때를 기준으로 판단해줬다 - u, v로 분리한 이후에는, u가 '올바른 괄호 문자열'인지를 판단해줬다. 이를 위한 isRight 메소드를 선언했다. - isRight 메소드는 스택을 통해서 올바른 괄호 문자열인지 판단해줬다 - u가 올바른 괄호 문자열이라면 3-1에 따라 재귀를 수행하고, 아니라면 4에 따라 작업을 수행했다 - 4를 수행하는 과정에서 getNewU라는 메소드를 통해서 새로운 u를 구해서 반환했다. 2) 소스 코드 import java.util.*; class Solution { public boo..
후보키 [프로그래머스] 1) 문제 접근 방법 (1) DFS를 통해, 순회하면서, relation의 col의 개수에 해당하는 범위(0이상 col-1 이하)에서 col의 위치를 선택합니다. -> 그리고 그 값들을 picked라는 ArrayList에 저장합니다. -> 이 때, 순차적으로만 picked에 선언하기 위해서 lastPick이라는 변수를 활용합니다. (2) picked에 1개 이상의 값이 저장되면, 선택된 col들을 통해서 유니크한 row를 식별해낼 수 있는지 판단한다. -> 이를 위해 checkUnique라는 메소드를 선언합니다. (2-1) checkUnique 메소드는 picked를 기준으로, 해당 picked에 속하는 col들에 있는 값들을 String으로 묶어서 만든 다음에, set에 저장합니다. (2-2) 만약에 ..
캐시 [프로그래머스] 1) 문제 접근 방법 - 캐시 사이즈가 0인 경우는, cities의 길이에 5 곱한 값을 반환합니다. -> 왜냐면, cache hit이 발생할 수 없고, 매번 cache miss가 발생하기 때문입니다. - 캐시 사이즈가 0이 아닌 경우는, (1) map이 city를 포함하고 있는 경우에는, cache hit이므로 answer에 1을 더하고, 최신 방문 idx를 업데이트합니다. (2) map이 city를 포함하고 있지 않은 경우에는, (2-1) map이 꽉 차지 않았다면, 그냥 map에 도시명과 최신 idx를 추가합니다. (2-2) map이 꽉 차 있다면, map의 keySet()을 통해 map을 순회하면서, lru인 string을 찾습니다. -> lru인 string을 찾는 기준은, 가장 idx(valu..
뉴스 클러스터링 [프로그래머스] 1) 문제 접근 방법 - str1, str2에서 각각 문자들로 구성된 것만, HashSet(set1, set2)에 저장한다. - 그 다음에 set1을 순회하면서, set2에 똑같은 것이 있으면, 삭제하면서, intersection와 union에 추가한다. - 다음은 set2을 순회하면서, 남은 것들을 union에 추가한다 - union의 사이즈가 0인 경우는, 65536을 그대로 반환한다 - union의 사이즈가 0이 아니면, rate를 계산한 후에, 65536을 곱하고, 그것의 내림 값을 반환한다. import java.util.*; class Solution { // 2개의 HashSet을 선언한다. public HashSet set1; public HashSet set2; // check 메소드를 ..
다트 게임 [프로그래머스] 1) 문제 접근 방법 - 스택을 활용하는 것이 핵심인 문제이다. - 1제곱, 2제곱, 3제곱 값은 Math.pow를 통해서 계산한 후에, int로 변환해서 스택에 저장합니다. - *가 나왔을 때는, 스택에서 값을 꺼내서 2배를 해줍니다. -> 이 때, 스택에 들어있는 값이 1개일 때와, 2개 이상일 때를 구분해서 계산해줍니다. - #가 나왓을 때는, 스택에서 값을 꺼내서 -1배를 해줍니다. - 숫자들은 String에 추가해놓고, S, D 혹은 T가 나왔을 때, int로 변환해서 계산한 후, 스택에 저장합니다. - 최종적으로 저장된 값들을 모두 스택에서 꺼내서 더해줍니다. import java.util.*; class Solution { public int solution(String dartResult)..
실패율 [프로그래머스] 1) 문제 접근 방법 - 각 스테이지마다, 해당 스테이지에 도달한 값을 카운트해주고, 그 다음에 해당 스테이지보다 크거나 같은 값을 total에 더해준 후에, 두 값으로 실패율을 구해서 ArrayList에 저장한다. - ArrayList에 저장할 때는, 인덱스와 실패율을 Pair로 만들어서 저장한다. - 그 다음에 실패율을 기준으로 내림차순 정렬을 하기 위해서, Collecitons.sort(arr, (o1, o2) -> Double.compare(o2.rate, o1.rate));를 해준다. - 여기서 중요한 것이, 스테이지에 도달한 유저가 없는 경우에는, 해당 스테이지의 실패율은 0으로 정의해야 하는데, 이 케이스를 따로 분리해줘야 한다. - 그 다음에 내림차순 정렬 순서의 인덱스를 결과에 저장해준다..
오픈채팅방 [프로그래머스] 1) 문제 접근 방법 - Enter, Leave일 때만, result에 포함되면 됩니다. - Enter, Change 로 입력될 때, HashMap에 저장해서 관리합니다. -> 또한, Enter혹은 Change를 통해서 닉네임이 변경되면, HashMap에 반영하였습니다. - String을 쪼갤 때는 split을 사용합니다. - ArrayList arr에는 Enter, Leave일 때의 id를 저장합니다. -> 이것을 저장하는 이유는, 나중에 Result에 String으로 만들 값을 넣기 위해서입니다. - 최종적으로 arr을 순회하면서, 해당 id에 맞는 Nickname을 HashMap에서 찾아서, 결과 String을 만들어서 result에 추가합니다. import java.util.*; // id와 ac..
알파벳 [BOJ 1987] 1. 문제에 대한 이해 우리가 풀어야 할 문제는 무엇인가? 주어진 자료는 무엇인가? 조건은 무엇인가? 우리가 문제를 풀기 위해 주어진 자료가 충분한가? 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라. - 문제가 무엇인가? -> 어떻게 설정할 것인가? -> 이동을 어떻게 설정할 것인가? -> 문제가 무엇인가? -> 문제가 무엇인가? -> 왜 시간 초과가 발생하는가? -> 2. 계획 전에 비슷한 문제를 알고 있는가? 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가? 비슷한 문제를 풀어본 적이 있다면 그 것을 활용할 수 있는가? 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가? 자..
테트로미노 [BOJ 14500] 1. 문제에 대한 이해 우리가 풀어야 할 문제는 무엇인가? 주어진 자료는 무엇인가? 조건은 무엇인가? 우리가 문제를 풀기 위해 주어진 자료가 충분한가? 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라. - 문제가 무엇인가? -> 2. 계획 전에 비슷한 문제를 알고 있는가? 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가? 비슷한 문제를 풀어본 적이 있다면 그 것을 활용할 수 있는가? 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가? 자료는 모두 사용했는가? 조건을 모두 사용했는가? 문제에 포함된 핵심적인 개념은 모두 고려했는가? 3. 실행 풀이 계획을 실행하고, 각 단계가 올바..