본문 바로가기
Problem Solving

[Swift] 프로그래머스 영어 끝말잇기(lv. 2)

by DuncanKim 2023. 3. 11.
728x90

[Swift] 프로그래머스 영어 끝말잇기(lv. 2)

 

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근

문제가 길긴 했지만, '탈락하는 사람'이 누구인지, 몇 번 째 턴에서 탈락한 것인지를 구하면 되는 문제이다.

주어지는 String 배열은 이미 진행한 결과로, 누가 틀렸는지를 분석해내는 것이라고 생각하면 쉬울 것 같다.

 

loop, person 변수에는 현재 진행되고 있는 라운드, 현재 단어를 말하고 있는 사람을 계산하여 각각 넣어두었다.

loop는 n은 참여한 사람의 숫자이기 때문에, 여기에 1을 더해서 현재 반복문 안의 인덱스를 나눈 몫을 구하면 된다.

person은 n + 1 한 숫자를 나눈 나머지를 구하면 된다. 

n + 1을 한 이유는 반복문 인덱스가 0부터 시작하기 때문이다.

 

appearWord 배열은 등장한 단어를 집어넣어 중복을 체크하기 위해 만들었다.

 

반복문 안의 조건문은 두 가지로 되어 있다.

 

첫 번 째 if 문은 words 배열을 순차적으로 읽어 끝 인덱스에 갔을 경우에 판별해주는 것으로,

만약 그 때 등장한 단어가 appearWord에 있으면 현재 person과 loop값을 출력해준다.

또는 이전에 등장한 단어 끝과 마지막 단어의 앞 글자가 다르면 현재 person과 loop값을 출력해준다.

그렇지 않다면 [0, 0]을 출력해야 하기 때문에 break로 탈출한다.

 

두 번째 if 문은 끝 인덱스가 아닐 경우 모두 통과해야 되는 부분이다.

조건을 현재 원소와 다음 원소를 비교하는 것으로 했다. 0번째 것을 해결하기 귀찮았기 때문이다.

if 문 내부의 if문은 중복 단어가 있을 경우 바로 return을 해주는 부분이며, 중복된 단어가 없다면 appearWord에 단어를 계속 넣어주게 되어 있다. else문은 현재 단어의 마지막 글자와 다음에 나올 단어의 첫 글자가 다를 경우, 들어오게 되는데, 여기에서도 현재 단어가 등장했다면, 현재 말하고 있는 사람이 잘못된 단어를 말한 것이므로 현재 사람의 loop와 person을 출력해주고, 그것이 아니면 다음 사람의 person과 index를 출력해주면 된다.

 

다른 사람의 풀이를 보았는데, 슬라이싱을 활용해서 잘 푼 것 같다. 나도 저렇게 풀어보도록 해봐야 겠다...!

 

 

<다른 사람의 풀이>

func solution(_ n:Int, _ words:[String]) -> [Int] {
    for i in 1..<words.count {
        if (words[i-1][words[i-1].index(words[i-1].endIndex, offsetBy:-1)] != words[i][words[i].index(words[i].startIndex, offsetBy: 0)]) || (words[0..<i].contains(words[i])){
            return [((i+1) % n == 0 ? n : (i+1) % n), Int(i/n)+1]
        }
    }
    return [0,0]
}

 

3. 코드

<내 최종 코드>

import Foundation

func solution(_ n:Int, _ words:[String]) -> [Int] {
    var appearWord = [String]()
    var loop = 0
    var person = 0
    for i in 0 ... words.count - 1 {
        person = i % n + 1
        loop = i / n + 1
        if i == words.count - 1 {
            if appearWord.contains(words[i]) {
                return [person, loop]
            }
            if words[i - 1].last != words[i].first {
                return [person, loop]
            }
            break
        }
        if words[i].last == words[i + 1].first {
            if appearWord.contains(words[i]) {
                return [person, loop]
            }
            appearWord.append(words[i])
        } else {
            if appearWord.contains(words[i]) {
                return [person, loop]
            }
            person = (i + 1) % n + 1
            loop = (i + 1) / n + 1
            return [person, loop]
        }
    }
    return [0, 0]
}
728x90

댓글