https://school.programmers.co.kr/learn/courses/30/lessons/12981
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
0. 단어 기록
ArrayList를 선언해 앞서 불린 단어들을 저장한다.
pre : 바로 앞순서에 불린 단어
ArrayList<String> list = new ArrayList<>();
String pre = "";
1. 끝말잇기 순서
사람 순서대로 for문을 돌렸다.
만약 마지막 사람 차례였다면 i를 -1로 바꿔주면 다음 for문에서 i++ 연산이 일어나므로 i는 0이 됨.
for(int i=0; i<n; i++){
...
if(i==n-1) {
i = -1;
turn++;
}
}
2. 단어 순서
해당 turn과 사람 idx로 현재 차례의 단어의 인덱스를 계산
위 1번 연산으로 for문 종료조건이 성립되지 않으므로 단어 인덱스를 넘어가면 종료
int widx = n * turn + i;
if(widx>=words.length) break;
3. 끝말잇기 게임
list에 들어있는(이미 언급된) 단어가 아니고(AND) 이전의 단어의 끝글자와 현재 단어의 첫 글자가 같다면
list에 추가, pre(이전단어) 갱신
if(!list.contains(words[widx])
&& pre.charAt(pre.length()-1) == words[widx].charAt(0)){
list.add(words[widx]);
pre = words[widx];
}
아니라면 틀린 사람
else{
answer[0] = i+1;
answer[1] = turn+1;
break;
}
전체 코드
import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = new int[2];
int turn = 0, idx=0;
ArrayList<String> list = new ArrayList<>();
String pre = "";
for(int i=0; i<n; i++){
int widx = n * turn + i;
if(widx==0){
list.add(words[0]);
pre = words[0];
continue;
}
if(widx>=words.length) break;
if(!list.contains(words[widx])
&& pre.charAt(pre.length()-1) == words[widx].charAt(0)){
list.add(words[widx]);
pre = words[widx];
}else{
answer[0] = i+1;
answer[1] = turn+1;
break;
}
if(i==n-1) {
i = -1;
turn++;
}
}
return answer;
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] N개의 최소공배수 (Java/자바) - 유클리드호제법 (0) | 2023.11.17 |
---|---|
[프로그래머스] 수식 최대화(Java/자바) || 2020카카오인턴십 - dfs, 순열 (0) | 2023.11.17 |
[프로그래머스] 짝지어 제거하기(Java/자바) || 2017 팁스타운(stack, 완전탐색) (0) | 2023.10.14 |
[프로그래머스] 최소 직사각형 (Java/자바) || 코딩테스트 연습(완전탐색) (0) | 2023.10.14 |
[프로그래머스] 구멍보트 (JAVA/자바) (0) | 2023.09.26 |