PIDGEY
PIDGEY's Dev. BLOG
PIDGEY
전체 방문자
오늘
어제
  • 분류 전체보기 (30)
    • 개발 (28)
      • Java (6)
      • Spring Framework (4)
      • Design Pattern (7)
      • CS (0)
      • Algorithm (8)
      • React.JS (2)
    • 일기 (2)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

hELLO · Designed By 정상우.
PIDGEY

PIDGEY's Dev. BLOG

개발/Algorithm

[Java] 영어 끝말잇기 (프로그래머스 Summer/Winter Coding(~2018))

2023. 6. 26. 08:08

문제 설명

상세한 문제 설명은 프로그래머스에서 확인할 수 있습니다.

아래와 같이 우리가 알고 있는 영어 끝말잇기 규칙과 같습니다.

  1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  4. 이전에 등장했던 단어는 사용할 수 없습니다.
  5. 한 글자인 단어는 인정되지 않습니다.

이 규칙에 맞게 N명이 끝말잇기를 진행할 때 가장 먼저 탈락한 사람의 번호와 자신의 몇 번째 차례에서 탈락하는지를 구하면 됩니다.

제한 사항

  • 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
  • words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
  • 단어의 길이는 2 이상 50 이하입니다.
  • 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 끝말잇기에 사용되는 단어의 뜻은 신경 쓰지 않으셔도 됩니다.
  • 정답은 [번호, 차례] 형태로 return 해주세요.
  • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

입출력 예시

n words result
3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3, 3]
5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0, 0]
2 ["hello", "one", "even", "never", "now", "world", "draw"] [1, 3]

두 번째 케이스의 경우에는 영어 끝말잇기 규칙을 모두 준수한 상태로 겹침 단어가 발생하지 않아 [0, 0] 이 정답입니다.

풀이

저는 Map을 이용해서 해당 단어가 사용됐는지 확인하기 위해 containsKey(...) 메서드를 사용했습니다.

또 나눗셈(/)과 나머지(%) 연산을 활용해서 정답을 구했습니다.
i가 0부터 시작하고 i 번째 단어에서 탈락자가 발생했을 때

  • (i % n) + 1 이 탈락한 사람의 번호입니다.
    • 입출력 예시 1번처럼 n이 3이라면 (8 % 3) + 1는 3이 됩니다.
  • (i / n) + 1 이 현재 끝말잇기가 몇 번째 사이클인지를 가리킵니다.
    • 마찬가지로 1번 예시 경우에서 연산하면 3이 됩니다.

코드

import java.util.HashMap;

class Solution {
    public int[] solution(int n, String[] words) {
        // 값이 변경되지 않고 무사히 리턴되는 경우 [0, 0]
        int[] answer = { 0 , 0 };
        
        HashMap<String, Integer> wordsMap = new HashMap<>();
        
        // 첫 번째 사람의 첫 번째 단어를 미리 추가
        wordsMap.put(words[0], 1);
        
        // 두 번째 사람의 첫 번째 단어부터 시작
        for (int i = 1; i < words.length; i++) {
            // 이전 단어의 마지막 문자와 현재 단어의 시작 문자를 비교하기 위해 변수 설정
            char last = words[i-1].charAt(words[i-1].length()-1);
            char start = words[i].charAt(0);
        
            // 끝말잇기 규칙에 안 맞는 경우
            if (last != start || wordsMap.containsKey(words[i])) {
                answer[0] = (i % n) + 1; // 현재 걸린 사람
                answer[1] = (i / n) + 1; // 몇 번째 사이클
                break;
            }
            
            wordsMap.put(words[i], 1);
        }
        
        return answer;
    }
}
저작자표시 비영리 동일조건 (새창열림)

'개발 > Algorithm' 카테고리의 다른 글

[Java] 다음 큰 숫자 (Programmers, Level 2)  (0) 2023.07.18
[Java] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT)  (0) 2023.06.30
[Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)  (0) 2023.06.26
[Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십)  (0) 2023.06.26
[Java] 백준 2178번: 미로 탐색  (0) 2023.01.05
    '개발/Algorithm' 카테고리의 다른 글
    • [Java] 다음 큰 숫자 (Programmers, Level 2)
    • [Java] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT)
    • [Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)
    • [Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십)
    PIDGEY
    PIDGEY

    티스토리툴바