출처: https://school.programmers.co.kr/learn/courses/30/lessons/12981
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
풀이
끝말잇기를 할 때 규칙은 다음과 같습니다.
1) 1번부터 끝 번호까지 차례대로 한 명씩 단어를 말하고, 마지막의 다음 순서는 1번입니다.
2) 이전에 등장한 단어는 사용할 수 없습니다.
3) 앞 사람이 말한 단어의 마지막 단어로 시작하는 단어를 말해야 합니다.
단어를 순서대로 받으면서 2, 3번 규칙을 어긴 사람의 번호와 순서를 return 하도록 하면 됩니다. 또 번호가 마지막 순서가 되면 다시 1번으로 초기화 합니다.
1) 번호 부여하기
참여자들의 번호를 number 라고 하고, 차례는 turn 이라고 합니다. 둘 다 1부터 시작하고 하나씩 늘어납니다.
마지막 번호가 되면 number는 다시 1로 돌아갑니다.
for(String word : words){
int number = 1, turn = 1;
/* 규칙 2, 3, 4 */
// 현재 순서가 마지막이었다면 1번으로 돌아가고, 아니라면 다음 순서로 넘어갑니다.
if(number == n) number = 1;
else number ++;
turn ++;
}
문제에서 요구하는 차례는 몇 번째 턴에 탈락했는지를 의미하고, turn은 몇 번째 단어인지를 의미하기 때문에 (turn - 1) / n + 1 해야합니다.
만약에 3명이 참가한다면 3개의 단어가 1번의 턴이 될 것입니다. 그렇다면 3개씩 묶음이 되는 것이고 그 묶음이 몇 번째인지를 구해야 합니다.
몇 번째 단어? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
몇 번째 턴? | 1 | 2 | 3 |
따라서 위 표처럼 몇 번째 턴인지를 구하기 위해서는 (turn - 1) / n + 1을 해주면 됩니다.
2) 이전에 등장한 단어는 사용할 수 없음
각 단어가 이전에 등장했었는지를 확인하기 위해 arraylist를 선언하고 각 단어는 list에 들어갑니다.
만약 현재 단어가 list에 포함되어 있다면 2번 규칙을 어겼기 때문에 탈락하게 됩니다.
if(list.contains(word)){
answer[0] = number;
answer[1] = (turn - 1) / n + 1;
}
3) 끝말잇기 하기
단어를 말할 때는 앞 사람이 말한 단어의 마지막 단어로 시작하는 단어를 말해야 합니다. 만약 이 규칙을 어긴다면 그 사람이 탈락하는 것이기 때문에 그 때의 number와 차례를 answer에 넣어주면 됩니다.
if(!list.isEmpty()){
// 앞 사람이 말한 단어
String past = list.get(list.size() - 1);
// 끝말잇기가 안된다면 탈락
if(past.charAt(past.length() - 1) != word.charAt(0)){
answer[0] = number;
answer[1] = (turn-1) / n + 1;
}
}
위 내용을 종합하여 코드를 작성하면 다음과 같습니다.
소스코드
import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = {0, 0}; // 번호, 차례
ArrayList<String> list = new ArrayList<>();
int number = 1, turn = 1;
for(String word : words){
// 2번 중복 규칙
if(list.contains(word)){
answer[0] = number;
answer[1] = (turn-1) / n + 1;
break;
}
// 3번 끝말잇기 규칙
if(!list.isEmpty()){
String past = list.get(list.size() - 1);
if(past.charAt(past.length() - 1) != word.charAt(0)){
answer[0] = number;
answer[1] = (turn-1) / n + 1;
break;
}
}
// 규칙을 어기지 않았다면 list에 포함
list.add(word);
// 순서 넘어가기
if(number == n) number = 1;
else number ++;
// 차례 하나씩 추가
turn ++;
}
return answer;
}
}
'Programming > Programmers' 카테고리의 다른 글
[프로그래머스] 131701번 - 연속 부분 수열 합의 개수 (Java) (0) | 2023.06.21 |
---|---|
[프로그래머스] 42842번 - 카펫 (Java) (0) | 2023.06.17 |
[프로그래머스] 76502번 - 괄호 회전하기 (Java) (0) | 2023.06.16 |
[프로그래머스] 138476번 - 귤 고르기 (Java) (0) | 2023.06.14 |
[프로그래머스] 12914번 - 멀리 뛰기 (Java) (0) | 2023.06.14 |