[프로그래머스] 영어 끝말잇기 (12981) - C++

2026. 1. 25. 14:53·Algorithms/Problem Solving

 

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

문제 간단 요약

  • n명이 영어 끝말잇기를 진행한다.
  • 이전 단어의 마지막 문자로 다음 단어를 시작해야 한다.
  • 이미 사용한 단어를 다시 말하거나,
  • 단어 길이가 1이면 탈락이다.

👉 규칙을 어긴 사람의 번호와 차례를 구하는 문제
👉 끝까지 문제가 없으면 [0, 0] 반환

 

문제의 핵심 포인트

 

이 문제는 알고리즘 자체는 어렵지 않다.
대신 다음 요소들을 꼼꼼하게 처리해야 한다.

  1. 이미 사용한 단어인지
  2. 끝말잇기 규칙이 지켜졌는지
  3. 단어 길이가 1인지
  4. 탈락한 인덱스로부터 사람 번호 / 차례 계산

 

사용한 해결 전략

  • unordered_set<string>
    → 이미 나온 단어를 빠르게 확인하기 위해 사용
  • 반복문으로 단어를 하나씩 검사
  • 규칙을 어기는 순간 인덱스를 저장하고 종료

전체 코드

#include <string>
#include <vector>
#include <iostream>
#include <unordered_set>

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer;
    unordered_set<string> used;

    used.insert(words[0]);
    answer.push_back(0);
    answer.push_back(0);

    int idx = -1;

    for(int i = 1; i < words.size(); i++){
        // 이미 나온 단어이거나 길이가 1인 경우
        if(used.count(words[i]) || words[i].length() == 1){
            idx = i;
            break;
        }

        // 끝말잇기 규칙 위반
        if(words[i-1][words[i-1].length()-1] != words[i][0]){
            idx = i;
            break;
        }

        // 사용한 단어로 등록
        used.insert(words[i]);
    }

    // 첫 단어가 길이 1인 경우 예외 처리
    if(words[0].length() == 1) idx = 0;

    if(idx != -1){
        answer[0] = idx % n + 1;   // 사람 번호
        answer[1] = idx / n + 1;   // 차례
    }

    return answer;
}

 


코드 핵심 설명

1. 중복 단어 체크

used.count(words[i])
  • 이미 나온 단어인지 확인
  • unordered_set 사용 → 평균 O(1)

2. 끝말잇기 규칙 체크

words[i-1][words[i-1].length()-1] != words[i][0]
  • 이전 단어의 마지막 문자
  • 현재 단어의 첫 문자 비교

3. 단어 길이 조건

words[i].length() == 1
  • 문제 조건에 명시된 부분
  • 자주 실수하는 조건

 문제 조건은 항상 끝까지 읽자…


이번 문제에서 했던 실수들 

❌ 1. 반복문 증가 조건 누락

used.insert(words[i]);
  • 이 줄을 안 넣어서
  • 중복 단어 체크가 제대로 안 됨

 

❌ 2. 인덱스 계산 실수

  • % n, / n 계산 헷갈림
  • +1 빠뜨림

0-based 인덱스 → 문제는 1-based ( 자주 하는 실수...)  -> 손으로 직접 검증하자!

 

❌ 3. 첫 단어 예외 처리

if(words[0].length() == 1) idx = 0;
  • 첫 단어도 규칙 위반 가능
  • 루프 밖에서 별도 처리 필요

 

'Algorithms > Problem Solving' 카테고리의 다른 글

[백준] 단지번호붙이기 2667 (silver 1) - c++  (0) 2026.02.01
[백준] DFS와 BFS 1260 (Silver 2) - C++  (0) 2026.02.01
[백준] 문자열 집합 14425 (Silver4) - C++ Hash 함수  (1) 2026.01.21
[백준] 두 수의 합 3273 (Silver3) — 해시 개념으로 시간복잡도 줄이기  (0) 2026.01.21
[프로그래머스] 기능 개발 42586 (Level 2) - C++  (0) 2026.01.18
'Algorithms/Problem Solving' 카테고리의 다른 글
  • [백준] 단지번호붙이기 2667 (silver 1) - c++
  • [백준] DFS와 BFS 1260 (Silver 2) - C++
  • [백준] 문자열 집합 14425 (Silver4) - C++ Hash 함수
  • [백준] 두 수의 합 3273 (Silver3) — 해시 개념으로 시간복잡도 줄이기
wlals916
wlals916
  • wlals916
    JM.devlog
    wlals916
    GitHub
  • 전체
    오늘
    어제
    • 분류 전체보기 (28)
      • Algorithms (20)
        • Problem Solving (14)
        • Language & Concept (6)
      • Backend (7)
        • Study Notes (1)
        • Trouble Shooting (6)
        • Development (0)
      • AI (0)
      • Review (1)
      • Dev Log (0)
  • 관리자

    • 글쓰기
    • 관리 페이지
    • 티스토리 홈
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    코테
    김영한
    회고
    백엔드
    DevOps
    SpringBoot
    백준
    프로그래머스
    코딩테스트
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
wlals916
[프로그래머스] 영어 끝말잇기 (12981) - C++
상단으로

티스토리툴바