일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- redissonlock aop
- springsecurity
- jpa
- RefreshToken
- 백준
- 멀티모듈 테스트컨테이너
- 소수찾기 java
- AccessToken
- DI
- kotest testcontainers
- 형상관리
- Invalid property 'principal.username' of bean class
- 낙관적 락 롤백
- ObjectOptimisticLockingFailureException 처리
- TestContainers
- 알고리즘
- ObjectOptimisticLockingFailureException
- S3
- 낙관적 락 재시도
- multimodule testcontainers
- aop
- spring DI
- interface
- netty
- OptimisticLock
- spring aop
- Spring Cloud Gateway
- @transactional
- 우아한 테크러닝
- java
- Today
- Total
조급하면 모래성이 될뿐
[프로그래머스] 방금그곡 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17683
코드
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
class Solution {
public String solution(String m, String[] musicinfos) throws Exception {
String answer = "(None)";
m = m.replaceAll("C#","c");
m = m.replaceAll("D#","d");
m = m.replaceAll("F#","f");
m = m.replaceAll("G#","g");
m = m.replaceAll("A#","a");
int max = -1 ;
for ( int i = 0; i < musicinfos.length; i++ ) {
String[] music = musicinfos[i].split(",");
SimpleDateFormat f = new SimpleDateFormat("HH:mm", Locale.KOREA);
Date start = f.parse(music[0]);
Date end = f.parse(music[1]);
long diff = end.getTime() - start.getTime() ;
long minute = diff / (1000*60);
String musicInfo = music[3];
musicInfo = musicInfo.replaceAll("C#","c");
musicInfo = musicInfo.replaceAll("D#","d");
musicInfo = musicInfo.replaceAll("F#","f");
musicInfo = musicInfo.replaceAll("G#","g");
musicInfo = musicInfo.replaceAll("A#","a");
StringBuilder sb = new StringBuilder();
boolean contains = false;
int size = musicInfo.length();
// 분이 더 짧다면 조금만돌아야한다.
for ( int j = 0; j < minute; j++ ) {
// 2번만 붙여도 가능한지 여부를 알 수 있다.
if ( sb.toString().length() >= m.length()*2 && j >= musicInfo.length()*2 ) break;
sb.append(musicInfo.charAt(j%size));
if ( sb.toString().length() >= m.length() && sb.toString().contains(m) ){
contains=true;
break;
}
}
if ( contains ) {
// 재생시간이 같은경우 변경하지 않는다.
if ( max == (int)minute ) continue;
// 조건이 일치하는 음악이 여러 개일때는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다.
if ( (int)minute > max ) {
max = (int)minute;
answer = music[2];
}
}
}
return answer;
}
}
제출 결과
나의 풀이
1. C#, D#, F#, G#, A#과 같은경우 문자열 처리를 편하게 하기위해 #이 붙은 음은 소문자로 변경해 주었다.
ex) C# -> c , D# -> d
2. 주어진 musicInfos에서 시간을 계산하여, 총 몇분동안 음악이 나왔는지 계산.
3. 이제 음악이 나온시간만큼 musicinfos의 음을 붙여나간다.
4. 붙여나가면서 기억하고 있는 멜로디가 완성되는지를 확인한다.
* 주의사항
최초 제출 시 22,23,24,29,30번이 계속 실패하였다.
22,23,24,29번 테스트 케이스의 경우에는 곡을 찾을 수 없는 경우에 "(None)"을 return하도록 변경하여 조치하였다.
변경 전에는 "'(None)'" 로 ''를 붙여주었기 때문에 실패가 났던것 같다.
30번 케이스의 경우에는 최초에 풀이3번째 음을 붙여나가는 반복문의 수행을 분기처리하였다.
분기의조건은 기억하고있는 멜로디가, 음악정보의 음에 포함되있는지를 먼저 확인한 후에 포함되어있지않으면 for문을 수행하도록 하였다. ( 시간을 줄이기위해서.. )
그런데, 만약 m="CC"인데 "04:00,04:02,ZERO,ACC" 와 같이 주어진경우에는 라디오에 음악이 2분만 나왔기 때문에 사실상 라디오에서는 AC만 흘러나왔고 내가 기억한 CC는 찾을 수 없게된다.
이 경우를 고려하여 분기처리를 제거하고 2에서 계산된 minute만큼만 무조건 for문을 수행하도록 조치하였다.
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 후보키 (0) | 2020.04.13 |
---|---|
[프로그래머스] 뉴스 클러스터링 (0) | 2020.04.06 |
[프로그래머스] 영어 끝말잇기 (0) | 2020.04.05 |
[프로그래머스] 점프와 순간 이동 (7) | 2020.04.04 |
[프로그래머스] 튜플 (0) | 2020.04.03 |