입력 파싱, m을 musicinfo의 melody에서 찾기
-> 이렇게 하면 불필요하게 한 번 더 돌아야 한다. musicinfo의 melody를 m에서 찾기.
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int j = 0; j < m.length(); j++) {
segment += m.charAt(j);
// System.out.println("segment = " + segment);
int lengthOfMusic = melody[0].length(); // 음악의 길이
// System.out.println(lengthOfMusic);
int idx = melody[0].indexOf(segment);
if(idx + segment.length() == melody[0].length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
m = m.replaceAll(segment, "");
System.out.println(m);
}
if(idx != -1) {
System.out.println("멜로디 인덱스");
System.out.println(melody[0].charAt(idx));
}
}
for(int i = 0; i < len; i++) {
}
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
String m = "ABCDEFG";
String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
while문을 쓰면 안 됨.
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
int loop = 10;
while(loop > 0) {
loop--;
if(melody[0].length() == 0) {
System.out.println("이제 없어..");
break;
}
for(int j = 0; j < melody[0].length(); j++) {
segment += melody[0].charAt(j);
System.out.println("segment = " + segment);
int lengthOfMusic = m.length();
// System.out.println(lengthOfMusic);
int idx = m.indexOf(segment);
System.out.println("idx = " + idx);
if(idx + segment.length() == m.length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
melody[0] = melody[0].replaceAll(segment, "");
System.out.println(melody[0]);
// segment 초기화
segment = "";
// j 초기화
j = 0;
}
if(idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("melody[0]" + melody[0]);
if(melody[0].equals(segment)) {
System.out.println("일치함,,,");
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
}
}
for(int i = 0; i < len; i++) {
}
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
String m = "ABCDEFG";
String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
음악 하나에 대해 일치 여부 찾기
이제 음악의 개수만큼 for문 돌리기
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int j = 0; j < melody[0].length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
segment += melody[0].charAt(j);
System.out.println("segment = " + segment);
if(melody[0].length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = m.length();
// System.out.println(lengthOfMusic);
int idx = m.indexOf(segment);
System.out.println("idx = " + idx);
if(idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("melody[0]" + melody[0]);
if(melody[0].equals(segment)) {
System.out.println("일치함,,,");
candidate.add(0);
System.out.println("m에서 segment 지움");
melody[0] = melody[0].replaceAll(segment, "");
System.out.println(melody[0]);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == m.length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
melody[0] = melody[0].replaceAll(segment, "");
System.out.println(melody[0]);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
for(int i = 0; i < len; i++) {
}
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
String m = "ABCDEFG";
String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
어차피 조삼모사였고 m과 일치하는 melody를 찾아야 하므로 melody에서 m을 찾아야 한다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int i = 0; i < len; i++) {
for(int j = 0; j < melody[i].length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
segment += melody[i].charAt(j);
System.out.println("segment = " + segment);
if(melody[i].length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = m.length();
// System.out.println(lengthOfMusic);
int idx = m.indexOf(segment);
System.out.println("idx = " + idx);
if(idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("melody[i]" + melody[i]);
if(melody[i].equals(segment)) {
System.out.println("일치함,,,");
candidate.add(i);
System.out.println("m에서 segment 지움");
melody[i] = melody[i].replaceAll(segment, "");
System.out.println(melody[i]);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == m.length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
melody[i] = melody[i].replaceAll(segment, "");
System.out.println(melody[i]);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
}
System.out.println(candidate);
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
String m = "ABC";
String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
이제 곡이 여러 번 반복되는 테스트케이스 2번만 해결하면 된다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int i = 0; i < len; i++) {
for(int j = 0; j < m.length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
segment += m.charAt(j);
System.out.println("segment = " + segment);
if(m.length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = melody[i].length();
// System.out.println(lengthOfMusic);
int idx = melody[i].indexOf(segment);
System.out.println("idx = " + idx);
if(idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("m" + m);
if(m.equals(segment)) {
System.out.println("일치함,,,");
candidate.add(i);
System.out.println("m에서 segment 지움");
m = m.replaceAll(segment, "");
System.out.println(m);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == melody[i].length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
m = m.replaceAll(segment, "");
System.out.println(m);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
}
System.out.println(candidate);
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
String m = "CC#BCC#BCC#BCC#B";
String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
Test case 1, 2 해결
음계 중 샾 파싱 다시하기
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int i = 0; i < len; i++) {
System.out.println("노래 제목 = " + title[i]);
String music = m;
for(int j = 0; j < music.length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
segment += music.charAt(j);
System.out.println("segment = " + segment);
if(music.length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = melody[i].length();
// System.out.println(lengthOfMusic);
int idx = melody[i].indexOf(segment);
System.out.println("idx = " + idx);
if(idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("music" + music);
if(music.equals(segment)) {
System.out.println("일치함,,,");
candidate.add(i);
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == melody[i].length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
}
System.out.println(candidate);
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
String m = "ABC";
String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
solution(m, musicinfos);
}
}
여기까지 했는데 30점 맞음
import java.util.ArrayList;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = tmp[3];
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int i = 0; i < len; i++) {
System.out.println("노래 제목 = " + title[i]);
String music = m;
// segment 초기화
segment = "";
for(int j = 0; j < music.length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
if(music.charAt(j) != '#') {
segment += music.charAt(j);
}
System.out.println("music입니다....");
System.out.println(music);
System.out.println("예...");
if(j < music.length() - 1 && music.charAt(j + 1) == '#') {
segment += '#';
} else if(music.length() > 1 && j == 0 && music.charAt(1) == '#') {
segment += '#';
}
System.out.println("segment = " + segment);
if(music.length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = melody[i].length();
// System.out.println(lengthOfMusic);
int idx = melody[i].indexOf(segment);
System.out.println("idx = " + idx);
if(melody[i].charAt(idx + 1) != '#' && idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("music = " + music);
if(music.equals(segment)) {
System.out.println("일치함,,,");
if(candidate.isEmpty() || (melody[candidate.get(0)].length() > melody[i].length())) {
candidate.add(i);
}
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == melody[i].length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
if(music.equals("")) {
if(candidate.isEmpty() || melody[candidate.get(0)].length() > melody[i].length()) {
candidate.add(i);
}
}
System.out.println("candidate = ");
System.out.println(candidate);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
}
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
System.out.println("sdlkfsjdljsdkldjfslksdf");
System.out.println(candidate.get(0));
answer = title[candidate.get(0)];
return answer;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
String m = "ABC";
String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
System.out.println(solution(m, musicinfos));
}
}
#을 새로운 문자로 모두 치환하는 아이디어(참고)
import java.util.ArrayList;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 일치하는 음악의 인덱스 저장
ArrayList<Integer> candidate = new ArrayList<>();
// 0. 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for(int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = changeMelody(tmp[3]);
}
// 1. m과 musicinfos의 멜로디가 일치하는 것을 찾기
// m의 0번째 인덱스를 musicinfos에서 찾는다.
// musicinfos의 인덱스 i번째부터 +1을 하면서 m의 인덱스와 일치하는지 확인한다.
// 이 과정을 음악 하나하나 for문으로 확인하면 낭비이므로 for문 한번에 모든 음악과 일치하는지 확인한다.
String segment = "";
for(int i = 0; i < len; i++) {
System.out.println("노래 제목 = " + title[i]);
String music = m;
// segment 초기화
segment = "";
for(int j = 0; j < music.length(); j++) {
System.out.println("------------");
System.out.println("j = " + j);
if(music.charAt(j) != '#') {
segment += music.charAt(j);
}
System.out.println("music입니다....");
System.out.println(music);
System.out.println("예...");
if(j < music.length() - 1 && music.charAt(j + 1) == '#') {
segment += '#';
} else if(music.length() > 1 && j == 0 && music.charAt(1) == '#') {
segment += '#';
}
System.out.println("segment = " + segment);
if(music.length() == 0) {
System.out.println("이제 없어..");
break;
}
int lengthOfMusic = melody[i].length();
// System.out.println(lengthOfMusic);
int idx = melody[i].indexOf(segment);
System.out.println("idx = " + idx);
if(melody[i].charAt(idx + 1) != '#' && idx != -1) {
System.out.println("멜로디에 있음...");
System.out.println("music = " + music);
if(music.equals(segment)) {
System.out.println("일치함,,,");
if(candidate.isEmpty() || (melody[candidate.get(0)].length() > melody[i].length())) {
candidate.add(i);
}
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
break;
}
// System.out.println("멜로디 인덱스");
// System.out.println(m.charAt(idx));
}
if(idx + segment.length() == melody[i].length()) {
System.out.println("멜로디 마지막");
System.out.println(segment);
System.out.println("m에서 segment 지움");
music = music.replaceAll(segment, "");
System.out.println(music);
if(music.equals("")) {
if(candidate.isEmpty() || melody[candidate.get(0)].length() > melody[i].length()) {
candidate.add(i);
}
}
System.out.println("candidate = ");
System.out.println(candidate);
// segment 초기화
segment = "";
// j 초기화
j = -1; // 위에서 j = 1부터 시작함.. 왜지?
// 밑에 실행하면 안 됨.
continue;
}
}
}
// 하나의 musicinfos에 대하여
// 만약 indexOf가 있었고, 끝에 다다랐으면 그 때의 segment를 기억한다.
// segment에 해당하는 부분을 m에서 지운다.
// Test case 2
// CC#B CC#B CC#B CC#B
// CC#B CC#B CC#B
System.out.println("sdlkfsjdljsdkldjfslksdf");
System.out.println(candidate.get(0));
answer = title[candidate.get(0)];
return answer;
}
// 치환하는 아이디어
static String changeMelody(String oldMelody) {
oldMelody = oldMelody.replaceAll("C#", "H");
oldMelody = oldMelody.replaceAll("D#", "I");
oldMelody = oldMelody.replaceAll("F#", "J");
oldMelody = oldMelody.replaceAll("G#", "K");
String newMelody = oldMelody.replaceAll("A#", "L");
return newMelody;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
String m = "ABC";
String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
System.out.println(solution(m, musicinfos));
}
}
230810
case 3에서 중간부터 시작하는게 안 됨
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "";
// 정답 인덱스
int answerIdx = -1;
// # 치환
m = changeMelody(m);
// 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for (int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = changeMelody(tmp[3]);
}
// 각 곡마다 재생 시간만큼 돌면서 확인
for (int i = 0; i < musicinfos.length; i++) {
// 기억한 멜로디가 음악 재생 시간보다 길면 빠져나온다.
if (m.length() > time[i]) break;
// melody의 시작음을 네오가 기억하는 m의 인덱스에서 찾는다.
int start = m.indexOf(melody[i].charAt(0));
// 네오가 중간부터 들으면 어떡하지..
System.out.println(i);
System.out.println(start);
int flag = 0; // 일치하지 않음을 나타내는 플래그
// melody를 재생 시간만큼 돌린다.
for (int j = 0; j < time[i]; j++) {
System.out.println((j + start) % m.length());
// m.charAt((j + start) % m.length());
// m과 melody가 일치하는지 확인
if (m.charAt((j + start) % m.length()) == melody[i].charAt(j % melody[i].length())) {
// m의 마지막 인덱스까지 일치할 때 answer에 넣는다.
if (j == m.length() - 1) {
System.out.println("들어왔니");
// 비교할 answer가 없을 때
if (Objects.equals(answer, "")) {
answerIdx = i;
answer = title[i];
} else {
// 기존의 answer가 있을 때 재생 시간이 더 긴 음악을 할당
if(time[answerIdx] < time[i]) {
answerIdx = i;
answer = title[i];
}
}
break;
}
} else {
System.out.println("일치하지 않음.");
break;
}
// System.out.println(melody[i].charAt(j % melody[i].length()));
}
}
System.out.println(answer);
return answer;
}
// 치환
static String changeMelody(String oldMelody) {
oldMelody = oldMelody.replaceAll("C#", "H");
oldMelody = oldMelody.replaceAll("D#", "I");
oldMelody = oldMelody.replaceAll("F#", "J");
oldMelody = oldMelody.replaceAll("G#", "K");
String newMelody = oldMelody.replaceAll("A#", "L");
return newMelody;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
String m = "ABC";
String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
System.out.println(solution(m, musicinfos));
}
}
중간부터 반복되는 구절이 있을 때 이 코드로 파악할 수 없음.
import java.util.Objects;
class Solution {
public static String solution(String m, String[] musicinfos) {
String answer = "(None)";
int idx = -1;
// # 치환
m = changeMelody(m);
// 파싱하기
// musicinfos를 시작 시간, 끝나는 시간 / 노래 제목 / 멜로디
int len = musicinfos.length;
int[] time = new int[len];
String[] title = new String[len];
String[] melody = new String[len];
for (int i = 0; i < len; i++) {
String[] tmp = musicinfos[i].split(",");
tmp[1] = tmp[1].replaceAll(":", "");
tmp[0] = tmp[0].replaceAll(":", "");
time[i] = Integer.parseInt(tmp[1]) - Integer.parseInt(tmp[0]);
title[i] = tmp[2];
melody[i] = changeMelody(tmp[3]);
}
// 각 곡마다 재생 시간만큼 돌면서 확인
for (int i = 0; i < musicinfos.length; i++) {
// 기억한 멜로디가 음악 재생 시간보다 길면 빠져나온다.
if (m.length() > time[i]) break;
// melody의 시작음을 네오가 기억하는 m의 인덱스에서 찾는다.
// int start = m.indexOf(melody[i].charAt(0));
// m의 시작을 melody의 인덱스에서 찾는다. -> 반복되는 음이 있기 때문에 문장으로 찾아야 한다.
int start = melody[i].indexOf(m.charAt(0));
if(start == -1) break;
// 네오가 중간부터 들으면 어떡하지..
// System.out.println(i);
// System.out.println(start);
int flag = 0; // 일치하지 않음을 나타내는 플래그
// melody를 재생 시간만큼 돌린다.
for (int j = 0; j < time[i]; j++) {
System.out.println((j + start) % melody[i].length());
// m.charAt((j + start) % m.length());
// m과 melody가 일치하는지 확인
if (m.charAt(j % m.length()) == melody[i].charAt((j + start) % melody[i].length())) {
// m의 마지막 인덱스까지 일치할 때 answer에 넣는다.
if (j == m.length() - 1) {
System.out.println("들어왔니");
// 비교할 answer가 없을 때
if (Objects.equals(answer, "(None)")) {
answer = title[i];
idx = i;
} else {
// 기존의 answer가 있을 때 재생 시간이 더 긴 음악을 할당
if(time[idx] < time[i]) { ///////////////////
answer = title[i];
idx = i;
}
}
break;
}
} else {
System.out.println("일치하지 않음.");
break;
}
// System.out.println(melody[i].charAt(j % melody[i].length()));
}
}
System.out.println(answer);
return answer;
}
// 치환
static String changeMelody(String oldMelody) {
oldMelody = oldMelody.replaceAll("C#", "H");
oldMelody = oldMelody.replaceAll("D#", "I");
oldMelody = oldMelody.replaceAll("F#", "J");
oldMelody = oldMelody.replaceAll("G#", "K");
String newMelody = oldMelody.replaceAll("A#", "L");
return newMelody;
}
public static void main(String[] args) {
// Test case 1 : "HELLO"
// String m = "ABCDEFG";
// String[] musicinfos = {"12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 2 : "FOO"
// String m = "CC#BCC#BCC#BCC#B";
// String[] musicinfos = {"03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"};
// Test case 3: "WORLD"
// String m = "ABC";
// String[] musicinfos = {"12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"};
// Test case 4: "HELLO"
String m = "CDCDF";
String[] musicinfos = {"12:00,12:14,HELLO,CDCDCDF", "13:00,13:59,WORLD,AA"};
System.out.println(solution(m, musicinfos));
}
}
'Algorithm' 카테고리의 다른 글
DFS와 BFS (0) | 2023.10.09 |
---|---|
파일명 정렬 (0) | 2023.08.03 |
[프로그래머스] 캐시 (0) | 2023.07.18 |
[프로그래머스] Java 요격 시스템 (0) | 2023.06.30 |
[프로그래머스] 완주하지 못한 선수 Java (0) | 2023.06.20 |