[프로그래머스 / C++] 영어 끝말잇기

Seulguo·2022년 10월 4일
0

Algorithm

목록 보기
176/185
post-thumbnail

🐣 문제

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


🐤 풀이

  1. set을 이용하여 중복을 확인했다.

  2. check 함수를 사용해 vector에 넣을 번호와 차례를 계산해주었다.

    •string의 front()와 back()을 사용하면 맨 앞글자와 맨 뒷글자 접근이 가능하다.
    •check 함수를 쓰지 않아도 i를 가지고 쉽게 계산할 수 있다.
    -> 이를 바탕으로 코드를 간결하게 만들어 보았다. (53줄 -> 19줄)


🐥 코드

#include <string>
#include <vector>
#include <iostream>
#include <set>
#include <cmath>

using namespace std;
vector<int> answer;

void check(int i, int n){
    int m = i % n;
    if(m == 0) m = n;
    
    int q = ceil((double)i/(double)n);
    
    answer.push_back(m);
    answer.push_back(q);
}

vector<int> solution(int n, vector<string> words) {
    
    set<string> s;
    s.insert(words[0]);
 
    for(int i = 1; i < words.size(); i++){
        
        string before = words[i-1];
        string now = words[i];

        if(before[before.size()-1] != now[0]){
            check(i+1, n); 
            break;
        }
        
        else{
            if(s.find(words[i]) == s.end()){
                s.insert(words[i]);
            }
            else{
               check(i+1, n); 
                break;
            }
        }
        
    }
   
    if(answer.size() == 0){
        answer.push_back(0);
        answer.push_back(0);
    }

    return answer;
}

** 더 간결한 풀이

#include <string>
#include <vector>
#include <iostream>
#include <set>
using namespace std;

vector<int> solution(int n, vector<string> words) {
    set<string> s;
    
    s.insert(words[0]);
    
    for(int i = 1; i < words.size(); i++){
        if(s.find(words[i]) != s.end() || words[i-1].back() != words[i].front())
            return{(i%n) + 1, (i/n) + 1};
        s.insert(words[i]);
    }
    
    return {0,0};
}

0개의 댓글