728x90
programmers.co.kr/learn/courses/30/lessons/17683
#include <string>
#include <vector>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include<cstring>
using namespace std;
string solution(string m, vector<string> musicinfos) {
string answer = "(None)";
vector<string>musics;
vector<string>melodies;
vector<int> ontimes;
for(int i=0; i<musicinfos.size(); i++){
string s = musicinfos[i];
int shour = stoi(s.substr(0,2));
int sminute = stoi(s.substr(3,2));
int ehour = stoi(s.substr(6,2));
int eminute = stoi(s.substr(9,2));
int totalminutes = (ehour-shour)*60 + (eminute-sminute);
int k = 12;
string music;
while(s[k]!=','){
music+=s[k];
k++;
}
string melody ="";
string realmelody="";
melody = s.substr(k+1);
int j=0;
while(j<melody.size()){
if(melody[j]=='#'){melody.erase(j,1);melody[j-1]=melody[j-1]-('A'-'a');continue;}//#이붙어있는것은 소문자로 변경
j++;
}
int musicsize = melody.size();
int times = totalminutes/musicsize;
int rest = totalminutes%musicsize;
for(int i=0; i<times; i++){
realmelody=realmelody+melody;
}
j =0;
int t =0;
int melodysize = melody.size();
while(j<rest){
realmelody+=melody.substr(j,1);
j++;
}
ontimes.push_back(totalminutes);
musics.push_back(music);
melodies.push_back(realmelody);
}
int j =0;
while(j<m.size()){
if(m[j]=='#'){m.erase(j,1);m[j-1]=m[j-1]-('A'-'a');continue;} //#이 붙어있는 것은 소문자로 변경
j++;
}
vector<int>candidates;
for(int i=0; i<melodies.size(); i++){
if(melodies[i].find(m)!=std::string::npos){
candidates.push_back(i);
}
}
if(candidates.size()==1){
answer = musics[candidates[0]];
return answer;
}
else if(candidates.size()>1){
int maxidx = candidates[0]; //후보중에 가장 앞에 있는 것부터 비교를 해야한다. 무작정 0부터 비교하는 실수 하지 않기
for(int p=1; p<candidates.size(); p++){
if(ontimes[maxidx]<ontimes[candidates[p]]){
maxidx = candidates[p];
}
}
answer = musics[maxidx];
}
return answer;
}
<JAVA>
class Solution {
//1시간 7분
public String solution(String m, String[] musicinfos) {
String answer = "";
int anslen =0;
for(int i=0; i<musicinfos.length; i++){
String str = musicinfos[i];
int hs = Integer.parseInt(str.substring(0,2));
int hm = Integer.parseInt(str.substring(3,5));
int is = hs*60+hm;
hs = Integer.parseInt(str.substring(6,8));
hm = Integer.parseInt(str.substring(9,11));
int ie = hs*60+hm; //시간 계산
int len = ie-is; //재생된시간
int a =12;
String title="";
while(str.charAt(a)!=','){
title+=str.charAt(a); //제목
a++;
}
a++;
String melody = str.substring(a); //멜뢰디
int melodysz = melody.length(); //멜로디 개수
for(int t=0; t<melody.length(); t++){ //실제 멜로디의 개수를 구한다
if(melody.charAt(t)=='#'){
melodysz--;
}
}
String total="";
if(melodysz<=len){ //재생시간이 멜로디보다 길때
for(int j=0; j<(len/melodysz); j++){ // 재생시간을 멜로디 길이 나눈 만큼 멜로디를 붙여준다
total+=melody;
}
}
int midx =0;
for(int j=0; j<(len%melodysz); j++){ // 멜로디길이 나눈 나머지 만큼 멜로디럴 넣어준다 이때'#'은 하나의 멜로디가 아닌걸 주의!
if(melody.charAt(midx)=='#'){
total+=melody.charAt(midx);
midx++;
}
total+=melody.charAt(midx);
midx++;
}
boolean tg =false;
for(int k=0; k<total.length(); k++){ //문자열 하나하나 모두 확인해 가야한다!
int tidx =k;
int idx =0;
while(tidx<total.length() && idx<m.length() && total.charAt(tidx)==m.charAt(idx)){
idx++;
tidx++;
}
if(idx==m.length()){
if(tidx == total.length()){tg=true;}
if(tidx<total.length() && total.charAt(tidx)!='#'){ //그다음이 '#' 이 되면 안된다.
tg = true;
}
}
}
if(tg && anslen<len){
answer =title;
anslen = len;
}
/*if(total.contains(m)){ //contains를 써서 확인이 안되는 이유: ABC# , ABC 모두 존재할 경우 이 코드가 안먹힌다.
String tmp = m+'#';
if(total.contains(tmp)){continue;}
if(answer.length()<title.length()){
answer =title;
}
}*/
}
if(answer.length()==0){answer="(None)";}
return answer;
}
}
'프로그래머스 > 문자열' 카테고리의 다른 글
추석 트래픽 (0) | 2021.01.29 |
---|---|
JadenCase 문자열 만들기 (0) | 2021.01.27 |
오픈채팅방 (0) | 2021.01.21 |
뉴스 클러스터링- 카카오 기출 (0) | 2021.01.19 |
N진수 게임 (0) | 2021.01.15 |