Study with book/Algorithms

[프로그래머스] 영어 끝말잇기


 

 

[영어 끝말잇기] https://programmers.co.kr/learn/courses/30/lessons/12981

영어 끝말잇기

 

 

풀고 느낀점

느낀건 쉬웠습니다. 문제를 읽자 마자 한 10분정도 생각하고 어떻게 물어야 할지 바로 떠올랐는데, 시간이 1시간 걸려버렸습니다. ^^;;;

2차배열로 만들어서 하나씩 순회하면서 Set 자료구조에 넣으면서 size가 다르면 중복되게 말한거니, 해당 index를 반환하면 끝이였습니다. 그런데 문제를 제대로 읽지 않아서 그런지, 끝말 잇기 규칙인 끝말이랑 시작말 체크하는 걸 빠뜨렸습니다. 실제 코딩 테스트 볼 때 진짜 주의해야겠습니다.

package algorithms.online.programmers.skill;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* 영어 끝말잇기 (O)
* https://programmers.co.kr/learn/courses/30/lessons/12981
*/
public class Level2_4 {
public static void main(String[] args) {
Level2_4 level24 = new Level2_4();
System.out.println(Arrays.toString(level24.solution(2, new String[]{"hello", "one", "even", "never", "now", "world", "draw"})));
System.out.println(Arrays.toString(level24.solution(3, new String[]{"tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"})));
System.out.println(Arrays.toString(level24.solution(5, new String[]{"hello", "observe", "effect", "take", "either", "recognize", "encourage",
"ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"})));
}
public int[] solution(int n, String[] words) {
int len = (words.length / n) + (words.length % n);
String[][] cache = new String[n][len];
for (int i = 0; i < n; i++) {
for (int j = 0; j < len; j++) {
if (i + (j * n) < words.length) {
cache[i][j] = words[i + (j * n)];
}
}
}
Set<String> valid = new HashSet<>();
int size = 1;
String before = "";
for (int i = 0; i < cache[0].length; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
valid.add(cache[j][i]);
before = cache[j][i];
} else {
char be = before.charAt(before.length() - 1);
char af = cache[j][i].charAt(0);
if (be != af) {
return new int[]{j + 1, i + 1};
}
valid.add(cache[j][i]);
before = cache[j][i];
size++;
if (valid.size() != size) {
return new int[]{j + 1, i + 1};
}
}
}
}
return new int[]{0, 0};
}
}
view raw Lastword.java hosted with ❤ by GitHub