문제설명
입력 & 출력
나의 풀이
이번 문제는 끝말잇기 문제입니다. 흔히 알고 있는 끝말잇기 룰과 똑같습니다. 따라서 n명의 사람이 끝말잇기를 하는 데 이미 나온 단어를 말하거나, 앞사람의 끝말에 맞지 않은 단어를 말하면 탈락자가 발생합니다. 이때 탈락자의 번호와 차례를 반환하면 되는 문제입니다.
처음에는 이중 리스트를 사용하여 문제를 풀었지만 처음 부터 모든 단어를 n명에 맞게 리스트를 저장하면 메모리 효율에 문제가 있을 것 같아서 단어를 분기 처리하고, 리스트에 넣는 방식을 채택했습니다.
풀이를 설명하자면 다음과 같습니다.
먼저 최종 탈락자의 번호와 차례를 넣을 answer배열을 초기화해 줍니다. 그리고 단어를 저장할 list를 만들어주고, 전체 단어만큼 반복문을 순회해 줍니다.
그리고 contains() 메서드를 사용하여 입력된 단어가 list에 존재한다면 즉 이미 말한 단어라면 탈락자가 발생하기 때문에 해당 탈락자의 번호와 차례를 배열에 담아줍니다.
n이 만약에 3이고, 모든 단어가 다음과 같다면
["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"]
- 사람 1 ➡️ 0,3,6,9...
- 사람 2 ➡️ 1,4,7,10...
- 사람 3 ➡️ 2,5,8,11...
위와 같이 몇 번째 사람인지 알 수 있습니다.
- 인덱스 0 / 3 = 0 (첫 번째 라운드)
- 인덱스 1 / 3 = 0 (첫 번째 라운드)
- 인덱스 2 / 3 = 0 (첫 번째 라운드)
- 인덱스 3 / 3 = 1 (두 번째 라운드)
- 인덱스 4 / 3 = 1 (두 번째 라운드)
- 인덱스 5 / 3 = 1 (두 번째 라운드)
- 인덱스 6 / 3 = 2 (세 번째 라운드)
- 인덱스 7 / 3 = 2 (세 번째 라운드)
- 인덱스 8 / 3 = 2 (세 번째 라운드)
위와 같이 각 사람의 차례를 구할 수 있습니다.
마저 풀이를 설명하자면 이미 입력한 단어뿐 아니라 앞사람의 끝말과 자신의 시작말이 다르다면 탈락자가 발생합니다.
따라서 첫 번째는 이전 사람이 없기 때문에 (i > 0)이라는 조건을 넣어주고, charAt() 메서드를 사용하여 전 사람의 마지막 단어 요소와 현재 단어의 첫 번째 요소를 비교하여 같지 않다면 탈락자를 설정해 줍니다.
여기까지 코드를 진행하면 최종 결과는 탈락자를 제외한 단어 리스트가 만들어지게 됩니다.
참고 ❗
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] LV.1 완주하지 못한 선수 (HashMap, StringBuilder, getOrDefault, Java) (1) | 2024.06.11 |
---|---|
[프로그래머스] Lv2. 전화번호 목록 (HashSet, startsWith, Java) (0) | 2024.06.11 |
[프로그래머스] Lv.1 [1차] 비밀지도 (toBinaryString(), StringBuilder,Java) (0) | 2024.06.09 |
[프로그래머스] Lv.2 이진 변환 반복하기 (toBinaryString, chars(), stream.count(), Java) (1) | 2024.06.08 |
[프로그래머스] Lv.1 예산 (greedy, 탐욕, 그리디 알고리즘, Java) (0) | 2024.06.08 |