Nam's

[프로그래머스 오답노트] 끝말잇기 본문

개발/Algorithm

[프로그래머스 오답노트] 끝말잇기

namespace 2021. 7. 28. 15:59
문제 출처: https://programmers.co.kr/learn/courses/30/lessons/12981#

반례를 기록해두는게 도움이 될 것 같아 글로 작성한다.

문제 설명: N명의 사람이 끝말잇기를 하는데, 처음 잘못 말한 사람이 누구인지 찾는 문제이다.
잘못말하는 경우는 끝음절을 잇지 않았거나, 이미 나온 단어를 말하는 경우 두 가지이다.

처음 짠 코드에 두 가지 오류가 있었다.

1. 나왔던 모든 단어와 비교

이전에 언급된 단어와만 비교해야지, 이후에 나온 단어까지 비교하면, 처음 말한 단어인데도 틀리는 경우가 생긴다.

2. 찾았으면 break

오류를 찾았으면 answer vector에 추가하고 for문을 break 해줘야 하는데, 이중 for loop이 있어서 제대로 break가 안됐다. 그래서 answer vectro의 size를 확인하고 0보다 커졌으면 break하게 수정해줬다.

*효율성을 위해서 나왔던 단어 체크를 위해 hash map을 사용해도 좋았을 것 같다.

코드:

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer;
    
    for(int i=1; i<words.size(); ++i){
        if(words[i][0]!=words[i-1][words[i-1].size()-1]){
            answer.push_back(i%n + 1);
            answer.push_back(i/n + 1);
            break;
        }
        
        for(int j=0; j<i; ++j){
            if(words[j]==words[i]){
                answer.push_back(i%n + 1);
                answer.push_back(i/n + 1);
            }
        }
        if(answer.size()>0) break;
    }
    if(answer.size()==0) return {0, 0};
    return answer;
}

 

Comments