https://programmers.co.kr/learn/courses/30/lessons/12981
์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = new int[2];
List<String> list = new ArrayList<String>();
boolean flag = true;
for(int i=0; i<words.length; i++){
if(list.contains(words[i])){ // ์ด์ ์ ๋ฑ์ฅํ ๋จ์ด์ธ๊ฒฝ์ฐ
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
flag = false;
break;
}
list.add(words[i]); // ํ์ฌ ๋จ์ด ๋ฆฌ์คํธ์ ๋ฃ๊ธฐ
// ์ด์ ๋๋จ์ด์ ํ์ฌ ์ฒซ๋จ์ด๊ฐ ๋ค๋ฅธ๊ฒฝ์ฐ - ๋๋ง์๊ธฐ๊ฐ ์๋๊ฒฝ์ฐ
if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
flag = false;
break;
}
}
if(flag) return new int[]{0, 0};
return answer;
}
}
ํ์ด
์ด์ ํ๋ค๊ฐ ์คํจํด์ ๋๋๊ณ ์ค๋ ๋ค์ ํ์ด๋ณด๋ ํด๊ฒฐํ๋ค.
๋ฌธ์ ๋ ๊ธธ์ง๋ง ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ ๋ฌธ์ ์ธ๋ฐ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- 1๋ฒ๋ถํฐ ๋ฒํธ ์์๋๋ก ํ ์ฌ๋์ฉ ์ฐจ๋ก๋๋ก ๋จ์ด๋ฅผ ๋งํฉ๋๋ค.
- ๋ง์ง๋ง ์ฌ๋์ด ๋จ์ด๋ฅผ ๋งํ ๋ค์์๋ ๋ค์ 1๋ฒ๋ถํฐ ์์ํฉ๋๋ค.
- ์์ฌ๋์ด ๋งํ ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์๋ก ์์ํ๋ ๋จ์ด๋ฅผ ๋งํด์ผ ํฉ๋๋ค.
- ์ด์ ์ ๋ฑ์ฅํ๋ ๋จ์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ ๊ธ์์ธ ๋จ์ด๋ ์ธ์ ๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ 2, 3, 4๋ฒ์ ์กฐ๊ฑด์ ์ ์ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋๋ค.
โ 3๋ฒ์ ์์ฌ๋์ด ๋งํ ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์์ ํ์ฌ ์ฌ๋์ด ๋งํ ์ฒซ๋ฒ์งธ ๋ฌธ์๊ฐ ๊ฐ์์ง ํ๋จ ํ๋ ์กฐ๊ฑด์ ๋ค์์ด๋ค.
(๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋จ์ด๋ ํ์ธํ ํ์๊ฐ ์์ผ๋ฏ๋ก i > 0 ์ด๋ผ๋ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.)
// ์ด์ ๋๋จ์ด์ ํ์ฌ ์ฒซ๋จ์ด๊ฐ ๋ค๋ฅธ๊ฒฝ์ฐ - ๋๋ง์๊ธฐ๊ฐ ์๋๊ฒฝ์ฐ
if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
flag = false;
break;
}
โ 4๋ฒ์ list์ ๋จ์ด๋ฅผ ํ๋์ฉ ๋ฃ๊ณ , ์ค๋ณต์ฒดํฌ(contains()) ๋ฉ์๋๋ฅผ ํตํด ํ์ธ์ ํ๋ค.
for(int i=0; i<words.length; i++){
if(list.contains(words[i])){ // ์ด์ ์ ๋ฑ์ฅํ ๋จ์ด์ธ๊ฒฝ์ฐ
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
flag = false;
break;
}
list.add(words[i]); // ํ์ฌ ๋จ์ด ๋ฆฌ์คํธ์ ๋ฃ๊ธฐ
โ ๋ง์ฝ ์์์ ์กฐ๊ฑด 3, 4๋ฒ์ ์ํด ํ๋ฝ์๊ฐ ์๊ธฐ์ง ์๋๋ค๋ฉด flag์ ๊ฐ์ ๊ทธ๋๋ก true์ด๋ฏ๋ก,
๋ง์ง๋ง์ true์ผ๊ฒฝ์ฐ [0, 0]์ ๋ฆฌํดํด์ค๋ค.
if(flag) return new int[]{0, 0};
๋ฆฌํดํ๋ ๊ฐ - [๋ฒํธ, ์ฐจ๋ก] ์์ ๋ฒํธ์ ์ฐจ๋ก๋ฅผ ์ด๋ป๊ฒ ๊ตฌํด์ผ ํ ์ง ๊ณ ๋ฏผ์ ์ข ํ๋๋ฐ, ์ง์ ์ฃผ์ด์ง ์ ์ถ๋ ฅ์ ์์ ๋ก ํ๋ํ๋ ์จ๊ฐ๋ฉฐ ๊ท์น์ ์ฐพ์์ ํด๊ฒฐํ๊ณ , ๋ฒํธ = (i%n) + 1 , ์ฐจ๋ก = (i/n) + 1 ์ด๋ผ๋ ๊ท์น์ด ์๋ค.
์ฒซ๋ฒ์งธ ์ ์ถ๋ ฅ ์์ ๋ฅผ ์๋ก ๋ค์ด์ ๋ณด์. ( n = 3 , ๋จ์ด = 9๊ฐ )
3 | [tank, kick, know, wheel, land, dream, mother, robot, tank] | [3,3] |
์ ๊ทธ๋ฆผ์์ ์ฒซ๋ฒ์งธ ์ด๋ค์ ๊ฐ์ i์๊ฐ(์ธ๋ฑ์ค)๋ฅผ ๋ํ๋ด๊ณ , ๋๋ฒ์งธ๋ ๋ฌธ์, ์ธ๋ฒ์งธ๊ฐ [๋ฒํธ, ์ฐจ๋ก]์ ํ์์ด๋ค.
๋จผ์ ๋ฒํธ ๋ถํฐ ํ์ธํด๋ณด์.
i์ ๊ฐ์ด 0, 3, 6 ์ผ๋ ์ฒซ๋ฒ์งธ ์ฌ๋์ด๋ค.
0, 3, 6 ์ 3์ผ๋ก ๋๋ด์๊ฒฝ์ฐ ๋๋จธ์ง๋ ๋ชจ๋ 0์ด๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ +1์ ํด์ฃผ๋ฉด ์ฒซ๋ฒ์งธ ์ฌ๋์ด ๋๋ค.
i์ ๊ฐ์ด 1, 4, 7 ์ผ๋ ๋๋ฒ์งธ ์ฌ๋์ด๋ค.
1, 4, 7 ์ 3์ผ๋ก ๋๋ด์๊ฒฝ์ฐ ๋๋จธ์ง๋ ๋ชจ๋ 1์ด๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ +1์ ํด์ฃผ๋ฉด ๋๋ฒ์งธ ์ฌ๋์ด ๋๋ค.
๋ฐ๋ผ์ ๊ท์น์ answer[0] = i%n + 1 ์ด ๋๋ค.
๊ทธ ๋ค์์ผ๋ก ์ฐจ๋ก๋ฅผ ํ์ธํด๋ณด์.
i์ ๊ฐ์ด 0, 1, 2 ์ผ๋ ์ฐจ๋ก๋ 1์ด๋ค.
0, 1, 2๋ฅผ 3์ผ๋ก ๋๋ด์๊ฒฝ์ฐ ๋ชซ์ 0์ด๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ +1์ ํด์ฃผ๋ฉด ์ฒซ๋ฒ์งธ ์ฐจ๋ก๊ฐ ๋๋ค.
i์ ๊ฐ์ด 3, 4, 5 ์ผ๋ ์ฐจ๋ก๋ 2์ด๋ค.
3, 4, 5 ๋ฅผ 3์ผ๋ก ๋๋ด์๊ฒฝ์ฐ ๋ชซ์ 1์ด๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ +1์ ํด์ฃผ๋ฉด ๋๋ฒ์งธ ์ฐจ๋ก๊ฐ ๋๋ค.
๋ฐ๋ผ์ ๊ท์น์ answer[1] = i/n + 1 ์ด ๋๋ค.
+ ์ด์ ํ์๋ ์ฝ๋๋ก๋ ํด๊ฒฐ์ด ๋๋ค.
class Solution {
// ๋ฐฐ์ด์ ๋จ์ด๊ฐ ์ค๋ณต์ธ์ง ์๋์ง ์ฒดํฌ
public static boolean checkWords(String[] words, String s, int end){
int count = 0;
boolean flag = true;
for(int i=0; i<end; i++)
if(words[i].equals(s))
count ++;
// ๋ฐฐ์ด์ ๋จ์ด๊ฐ ํ๊ฐ ์ธ ๊ฒฝ์ฐ
if(count == 0) flag = true;
// ๋ฐฐ์ด์ ๋จ์ด๊ฐ ๋๊ฐ ์ด์์ธ ๊ฒฝ์ฐ
else flag = false;
return flag;
}
public static int[] solution(int n, String[] words) {
int[] answer = new int[2];
boolean check = true; // ํ๋ฝ์๊ฐ ์๊ธฐ๋์ง ์๋์ง ์ฒดํฌ
int end = 0;
/* ํ๋ฝํ๋ ๊ฒฝ์ฐ๋ 2๊ฐ์ง -> ์ด์ ์ ๋งํ ๋จ์ด ๋งํ๊ฑฐ๋ ๋จ์ด๋ฅผ ์๋ชป ๋งํ ๊ฒฝ์ฐ */
for(int i=0; i<words.length; i++){
end = i;
// 1) ํ์ฌ ๋งํ ๋จ์ด๊ฐ ์ด์ ์ ๋ฑ์ฅํ๋ ๋จ์ด์ธ ๊ฒฝ์ฐ
if(!checkWords(words, words[i], end)){
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
check = false;
break;
}
// 2) ์์ฌ๋์ด ๋งํ ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์๋ก ์์ํ๋ ๋จ์ด๊ฐ ์๋๊ฒฝ์ฐ(e.g "never" - "now")
if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
check = false;
break;
}
}
// ์ for๋ฌธ์์ ํ๋ฝํ๋ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ 1), 2)์ ๋ชจ๋ ํฌํจ๋์ง ์๋ ๊ฒฝ์ฐ
if(check) return new int[]{0, 0};
return answer;
}
}
์ด์ ๋ ArrayList ๋์ ํ์ฌ์ ๋จ์ด๊ฐ ๋ฐฐ์ด์์ ์ด์ ์ ์ฌ์ฉ๋ ๋จ์ด์ธ์ง ์๋์ง ํ์ธ์ ํ๋ ๋ฉ์๋ checkWords()
๋ฅผ ๋ง๋ค์๋ค.
์ฌ๊ธฐ์ ๋งค๊ฐ๋ณ์ end๋ ์ด๋๊น์ง ๋ฐ๋ณต์ ํ ์ง ๊ฒฐ์ ํด์ฃผ๋ ๋ณ์์ธ๋ฐ,
๋ง์ฝ ์๋์์ know๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด์์๋, ์์๊ฐ(tank, kick)๊น์ง ํ์ธํด์ผ ํ๋ฏ๋ก i๊น์ง ํ์ธํด์ผ ํ๋ค.
๋ฐ๋ผ์ for๋ฌธ์ i๊น์ง ํ์ธํด์ผ ํ๋ฏ๋ก ๋งค๊ฐ๋ณ์์ ๋ฃ์ด์ฃผ์๋ค.
3 | [tank, kick, know, wheel, land, dream, mother, robot, tank] | [3,3] |
๊ทธ ์ธ ๋๋จธ์ง๋ ๋์ผํ๋ค.
+ ์ฒซ ์ฝ๋์ if๋ฌธ์ ํ๋๋ก ์ค์ด๋ฉด ๋ ๊ฐ๋จํ ์ฝ๋๊ฐ ๋๋ค.
import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = new int[2];
List<String> list = new ArrayList<String>();
boolean flag = true;
for(int i=0; i<words.length; i++){
if(i>0 && words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)
|| list.contains(words[i])){ // ์ด์ ์ ๋ฑ์ฅํ ๋จ์ด์ธ๊ฒฝ์ฐ
answer[0] = (i%n) + 1;
answer[1] = (i/n) + 1;
flag = false;
break;
}
list.add(words[i]); // ํ์ฌ ๋จ์ด ๋ฆฌ์คํธ์ ๋ฃ๊ธฐ
}
if(flag) return new int[]{0, 0};
return answer;
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค[Java] - (Level2)์์ ๋ง๋ค๊ธฐ (0) | 2020.03.18 |
---|---|
[Codeforces] 1257A: Two Rival Students (0) | 2020.03.18 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - (Level2)์ฌ๋ฐ๋ฅธ ๊ดํธ (0) | 2020.03.17 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - (Level2)์ ํ์ ์๊ฐ ์ด๋ (0) | 2020.03.17 |
ํ๋ก๊ทธ๋๋จธ์ค[Java] - (Level3)์ต๊ณ ์ ์งํฉ (1) | 2020.03.17 |
๋๊ธ