본문 바로가기
Algorithm/문제풀이_프로그래머스

[Swift][문자열][LV_2][프로그래머스] 영어 끝말잇기

by Joahnee 2021. 11. 19.

요구능력 : 문자열에 대한 이해

 

코드설명 : 

 

이 문제에서 핵심

1. 단어 자체가 이전에 나온적이 있는지 확인

2. 바로 이전단어의 끝 문자가 현재단어의 맨 앞문자와 일치하는지 확인 ex) char -> r로 시작해야됨

3. 끝말잇기를 성공한 경우를 확인

 

변수설명

count = 차례를 계산하기위해 수를 세는 변수

arr = 단어를 arr에 저장하면서 새로운 단어를 저장할 때 그게 앞전에 나온적이 있는지 확인하기 위한 변수

result = 결과를 저장하고 return하기 위함

order = 탈락자가 몇번째 순서인지 세기 위함.

 

1. 단어 자체가 이전에 나온적이 있는지 확인

contains() 함수를 사용하여 이전에 단어가 나온적이 있는지 확인 하였다.

 

2. 바로 이전단어의 끝 문자가 현재단어의 맨 앞문자와 일치하는지 확인 ex) char -> r로 시작해야됨

String을 캐릭터 배열 형태로 변형하고 배열의 last와 first를 적절히 사용하여 비교하였음.

 

3. 끝말잇기를 성공한 경우를 확인

arr의 수와 words의 수가 같은 경우에는 아무 조건에 걸리지않고 arr에 words를 잘 옮긴것이므로 끝말잇기가 성공적으로 끝난경우임.

 

4. 부가설명

이 부분은 count>=1을 넣어준 이유가 안넣어주면 처음에 count가 0일때 걸리게된다.

원래 목적인 이전단어의 끝글자와 다음단어의 첫글자를 비교하는 것이 아닌 현재단어의 첫글자와 끝글자를 비교하게됨.

ex) Hello가 있으면 H와 o를 비교하게된다.

if count >= 1 && temp != firstIdxArr.first!{
                break
            }

 

이건 몇번째에서 탈락하는지 구하기위한 식인데 내가 복잡하게 구한것일 수도있다.

result.append(Int(ceil((count + 1.0)/Double(n))) )

 

 

후기 : 문자열 분해할줄알고 흐름에 맞게 조건만 맞춰줄수 있다면 쉬운문제

func solution(_ n:Int, _ words:[String]) -> [Int] {
    var count: Double = 0
    var arr: [String] = []
    var result: [Int] = []
    var order = 0
    
    //배열에 하나씩 저장하면서 contains하고있으면 ..
    for i in words{
        order += 1
        if order > n {
            order = 1
        }
        if !arr.contains(i){
            var temp: Character = " "
            
            //처음에 last가 없어서 걸리니까 if let써서 땡기자.
            if let last = arr.last {
                for k in last{
                    temp = k
                }
            }
            
            arr.append(i)
            
            var firstIdxArr: [Character] = []
            for v in i{
                firstIdxArr.append(v)
            }
            
//            print("\(arr)")
//            print("firstIdx : \(firstIdxArr.first!)")
//            print("temp : \(temp)")
            
            
            if count >= 1 && temp != firstIdxArr.first!{
                break
            }
            count += 1
            
        }else{
            break
        }
        
        
    }
    if arr.count == words.count {
        result.append(0)
        result.append(0)
    }else {
        result.append(order)
        result.append(Int(ceil((count + 1.0)/Double(n))) )
    }
    return result
}

댓글