728x90
⬛ 프로그래머스 (카카오) | LV.2 [3차] 방금그곡 - 구현 문풀 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/17683
💚문제 접근 방식
1) 일단 ‘#’ 에 대해서는 replace로 치환 처리를 해주어야 한다.
2) for문으로 musicinfos를 순회하면서
→ 매번 재생시간 time을 구하고
→ 해당 name과 melodyInfo를 #치환해서 들고 있는다.
이제 이 상황에서 재생시간이 음악길이보다 더 길다면 melody 정보를 반복된 횟수와 남은 멜로디까지 이어붙인 fullMelody 정보로 세팅해준다.
이유는 melodyInfo에 m이 담겨있는 것으로 해당 음악을 재생한것인지 판별하기 위함이다.
3) 이후 time이 가장 긴 음악의 name을 갱신하다가 리턴해주면 된다. 없으면 None리턴
1차 제출 코드 | 예제 통과 최종 실패
나 같은 경우에는 info로 들어온 멜로디의 순서를 m처럼 동일 구조를 만들어주려고 헀다.. 근데 이게 뭔가 잘 안됐다.
결국 풀이를 보긴 했는데, 풀이에서는 재생 길이와 음악 길이를 비교해서 full 멜로디를 완성한뒤 contains로 확인하는 과정을 거쳤다. 내가 기존에 하던 방식에는 먼가 예외로 안되는 게 있나보다 ㅠㅠ
import java.util.*;
class Info implements Comparable<Info>{
int time;
String name;
Info(int time, String name){
this.time= time;
this.name =name;
}
public int compareTo(Info o){
return o.time - this.time;
}
}
class Solution {
static int getTime(String str){
int H = Integer.parseInt(str.split(":")[0]);
int M = Integer.parseInt(str.split(":")[1]);
return 60 * H + M;//분
}
static boolean equalsString(String a, String b){ //b는 항상
String tmp = "";
if(a.charAt(0) != b.charAt(0)){
int ed = b.indexOf(a.charAt(0));//그 시작 ed를 찾기
tmp = b.substring(ed);
tmp += b.substring(0, ed);
b = tmp;
}
if(a.equals(b) || a.contains(b) || b.contains(a)) return true;
return false;
}
//솔루션 함수
public String solution(String m, String[] musicinfos) {
String answer ="(None)";
m = m.replaceAll("A#", "1")
.replaceAll("C#", "2")
.replaceAll("D#", "3")
.replaceAll("G#", "4")
.replaceAll("F#", "5");
PriorityQueue<Info> pQ= new PriorityQueue<>();
for(String x : musicinfos){
String[] tmp = x.split(",");
int st = getTime(tmp[0]);
int ed = getTime(tmp[1]);
int time = ed - st;
String name = tmp[2];
String melody = tmp[3];
melody = melody.replaceAll("A#", "1")
.replaceAll("C#", "2")
.replaceAll("D#", "3")
.replaceAll("G#", "4")
.replaceAll("F#", "5");
boolean flag = equalsString(m, melody);
if(flag) pQ.offer(new Info(time, name));
}
if(!pQ.isEmpty()) answer = pQ.poll().name;
return answer;
}
}
💚 제출 코드 | 34번 케이스 통과를 위해서는 B# 도 추가해야 됨
- 계속 문제가 34번만 틀렸다고 되어 있어서 이유를 몰랐는데 ..
- 문제에서는 B#에 대한 음 이야기가 없다.. 그런데 B#에 대한 테스트케이스가 34번에 들어갔다고 한다. ^___^
[참고 링크] https://school.programmers.co.kr/questions/72411
- 암튼 이거까지 추가하니까 돌아갔다 …
import java.util.*;
class Solution {
static int getTime(String str){
int H = Integer.parseInt(str.split(":")[0]);
int M = Integer.parseInt(str.split(":")[1]);
return 60 * H + M;//분
}
static String changeMelody(String oldMelody) {
oldMelody = oldMelody.replaceAll("C#", "H")
.replaceAll("D#", "I").replaceAll("F#", "J").replaceAll("G#", "K")
.replaceAll("A#", "L").replaceAll("B#", "M"); // 문제에 없는 B# 코드 추가해야 [34]통과
return oldMelody;
}
//솔루션 함수
public String solution(String m, String[] musicinfos) {
String answer ="(None)";
int maxPlayTime = -1;
m = changeMelody(m);
for(String x : musicinfos){
String[] tmp = x.split(",");
int st = getTime(tmp[0]);
int ed = getTime(tmp[1]);
int time = ed - st;
String name = tmp[2];
String melodyInfo = changeMelody(tmp[3]);
//재생 시간 > 음악 길이
if(time > melodyInfo.length()){
StringBuilder newMel = new StringBuilder();
for(int i=0; i<time / melodyInfo.length() ;i++){
newMel.append(melodyInfo);
}
//나머지 만큼 악보에서 잘라 붙임
newMel.append(melodyInfo.substring(0, time % melodyInfo.length()));
melodyInfo = newMel.toString();
}else{
melodyInfo= melodyInfo.substring(0, time);
}
if(melodyInfo.contains(m) && time > maxPlayTime){
answer = name;
maxPlayTime = time;
}
}
return maxPlayTime != -1 ? answer : "(None)";
}
}
728x90
'코딩 테스트 [준비] > [문풀] 프로그래머스_문풀_조지기' 카테고리의 다른 글
프로그래머스 | LV.2 하노이의 탑 - 재귀 문풀 (Java) (25) | 2024.03.29 |
---|---|
프로그래머스 | LV.2 연도 별 평균 미세먼지 농도 조회하기 (MySQL) (22) | 2024.03.28 |
프로그래머스 | LV.2 멀쩡한 사각형- 구현 문풀 (Java) (26) | 2024.03.27 |
프로그래머스 | LV.2 큰 수 만들기 - 그리디 문풀 (Java) (1) | 2024.03.27 |
프로그래머스 (PCCP 기출) | LV.1 붕대 감기 - 단순 구현 문풀 (Java) (0) | 2024.03.22 |