[Programmers] Lv2 영어 끝말잇기 Java

2023. 2. 16. 13:44CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

 

자료형 정하기

 

문제에서 끝말잇기 규칙에서 이전 등장했던 단어는 사용할 수 없다고 말하였으니 끝말잇기를 진행하는 동안 지속적으로 비교를 해야 한다.

이때 해쉬를 이용하면 시간적인 면에서 효율적이다.

 

문제 풀이 과정

 

  1. 현재차례의 끝말잇기 하는 사람 구하기
  2. 끝말잇기 스테이지 구하기
  3. 실패여부 조건 설정

 

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. 실패여부 조건 설정

끝말잇기의 실패 여부 조건은 다음과 같다.

  1. 같은 단어가 나올때
  2. 이전 단어의 끝 문자와 현재 단어의 첫 문자가 다를 때

같은 단어가 나올 때는 검사하는 방법은 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;
    }
}

 

728x90