2023. 2. 16. 13:44ㆍCS/자료구조 & 알고리즘
문제 출처
[프로그래머스 코딩 테스트 연습]
https://school.programmers.co.kr/learn/courses/30/lessons/12981
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
자료형 정하기
문제에서 끝말잇기 규칙에서 이전 등장했던 단어는 사용할 수 없다고 말하였으니 끝말잇기를 진행하는 동안 지속적으로 비교를 해야 한다.
이때 해쉬를 이용하면 시간적인 면에서 효율적이다.
문제 풀이 과정
- 현재차례의 끝말잇기 하는 사람 구하기
- 끝말잇기 스테이지 구하기
- 실패여부 조건 설정
1. 현재 차례의 끝말잇기 하는 사람 구하기
현재 차례의 끝말잇기를 하는 사람은 간단하게 구할 수 있다.
각 진행마다 사람의 수로 나눈 나머지를 구하면 0부터 사람수-1씩 구할 수 있다.
여기서 + 1 하면 현재차례의 끝말잇기 하는 사람을 얻을 수 있다.
여기서는 최종으로 int[] 로 출력이 되므로 미리 만든 배열에 저장을 한다.
int[] answer = {1, 0}; // index 0: human
for (int i = 0; i < words.length(); i++)
answer[0] = (i) % n + 1;
2. 끝말잇기 스테이지 구하기
끝말잇기 스테이지는 사람이 첫번째 사람일 때마다 증가하게 된다.
처음에 0으로 잡고 시작하고 각 단어마다 스테이지 하는 사람이 첫 번째 사람인지 구하면 된다.
int[] answer = {1, 0}; // index 0: human, index 1: stage
for (int i = 0; i < words.length(); i++)
answer[0] = (i) % n + 1;
if (answer[0] == 1) answer[1]++;
3. 실패여부 조건 설정
끝말잇기의 실패 여부 조건은 다음과 같다.
- 같은 단어가 나올때
- 이전 단어의 끝 문자와 현재 단어의 첫 문자가 다를 때
같은 단어가 나올 때는 검사하는 방법은 HashSet을 이용하면 된다.
비교할 때에는 HashSet.contains(words[i])를 이용하여 비교하고
비교 조건 다음에 HashSet.add(words[i])로 해당 단어를 추가하면 된다.
이전 단어의 끝 문자와 현재 단어의 첫 문자 비교는
끝말잇기를 하고 나서 charAt(index)로 지속적으로 저장하고 저장한 것과 현재의 단어를 비교하면 된다.
소스 코드
import java.util.HashSet;
public class Solution {
public int[] solution(int n, String[] words) {
int[] answer = {1, 0};
HashSet<String> chainWords = new HashSet<>();
char endWord = words[0].charAt(0);
boolean isPass = true;
for (int i = 0; i < words.length; i++) {
answer[0] = (i) % n + 1;
if (answer[0] == 1) answer[1]++;
if (endWord != words[i].charAt(0) || chainWords.contains(words[i])) {
isPass = false;
break;
}
chainWords.add(words[i]);
endWord = words[i].charAt(words[i].length()-1);
}
return isPass ? new int [] {0, 0} : answer;
}
}
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
[Programmers] Lv2 짝지어 제거하기 Java (0) | 2023.02.15 |
---|---|
[Programmers] Lv2 다음 큰 숫자 Java (0) | 2023.02.14 |
[Programmers] Lv2 빛의 경로 사이클 Java (0) | 2023.02.11 |
[Programmers] Lv1 문자열 나누기 Java (0) | 2023.02.07 |
[Programmers] Lv1 성격 유형 검사하기 Java (0) | 2023.02.06 |