관리 메뉴

이 세계에선 내가 개발자?

[9086/Swift] 문자열 본문

알록리즘/BAEKLOG

[9086/Swift] 문자열

민디고 2023. 4. 17. 17:55

*** 언어는 Swift! ***

 

백준 알고리즘 문제를 풀어볼까 말까 풀어볼까 말까 100번을 고민하다가 회사에서 스터디를 하게 되서 드디어 풀어볼 수 있는 기회가 생겼다. 풀 때 마다 이렇게 포스팅 할 수 있으면 좋을 것 같은데 .. 열심히 한 번 도전해봐야겠다!

아자아자퐈이팅🔥🔥

 

첫번째 문제는 9086번의 문자열이라는 제목을 가진 친구다.

자세한 문제는 이렇다. (링크도 걸려있으니 풀고 싶은 사람은 츄라이츄라이⚡)

사실 말하면 예제 입력을 보고 조금 당황했다. 처음에 저것만 보니까 이해가 가지 않았기 때문이다.

문제를 찬찬히 다시 읽어보니 아래와 같이 정리가 되었다.

 

1. 첫 줄에 테스트 케이스를 몇 개 받을 건지 숫자를 입력하고,

2. 입력한 갯수 만큼 테스트 케이스를 입력받고,

3. 그 결과를 출력하라

 

자 그럼 하나 하나 씩 천천히 차례대로 입력에 맞는 코딩을 시작해보자

 

1. 입력의 첫 줄에는 테스트 케이스의 갯수 T(1 <= T <= 10)가 주어진다.

난 이번에 Swift로 백준을 처음 풀어봐서 input을 어떻게 주는지 몰랐는데 readLine() 이란 걸 이용하면 input을 받을 수 있다는 걸 알게 되었다. (지식 +1)

 

자 그럼 먼저 테스트 케이스의 갯수를 받아보자

let testCaseCount = readLine()

이게 끝이다 정말 간단하다 자 그럼 다음으로 넘어.. 가기 전에 이건 나중에 추가한거긴 한데 테스트 케이스의 조건이 있기 때문에 조건에 대한 내용도 추가해주자

(그 전에 testCaseCount로 받은 것에 대해서 Int로 형변환도 같이 해주었다)

guard let testCaseCount = testCaseCount,
      let count = Int(testCaseCount)
else { return }

/// 테스트 케이스의 조건에 맞지 않을 경우 return
if count < 1 || count > 10 {
    print("테스트 케이스의 조건에 맞지 않습니다.")
    return
}

여기서 조금 아쉬웠던게 나는 Xcode에서 문제를 풀 때 각각의 함수를 만들어서 guard let 을 사용할 수 있었는데 백준에서는 함수를 사용하지 않아야해서 값을 입력할 때 강제 언래핑(!) 을 시켜주거나 if let을 사용해서 언래핑을 해주었다.

 

함수 그대로 입력해... 도 되긴 하.. 는 거 같은데 어떤 문제에서는 잘 안됐었다.. (그냥 내 착각인가.. 다음 문제 때 다시 도전..)

 

2. 각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다.

요기서 이제 위에서 입력 받았던 testCaseCount를 사용하게 된다. 왜냐면 우리는 testCaseCount를 받은 만큼 문자열을 입력받아야하기 때문이다!

  for _ in 0..<count {
    if let testCaseString = readLine() {
        testCaseArray.append(testCaseString)
    }
}

그래서 for문으로 입력 받았던 testCaseCount 까지 돌려주고 그 안에서 문자열을 입력받은 후 String 배열에 저장해주었다. 왜냐하면 우리는 testCaseCount 갯수 만큼 입력받은 후에 다음 동작을 해야하기 때문에!

 

3. 각 테스트 케이스에 대해서 주어진 문자열의 첫 글자와 마지막 글자를 연속하여 출력한다.

이 부분에 대해서는 Swift에서 아주 좋은 친구를 제공하고 있어서 솔직히 쉽게 할 수 있었다. 바로 String의 first와 last를 구하는 방법이다.

 

String.first와 last는 옵셔널 Character 타입이고 first의 설명을 보면 콜렉션의 첫번째 요소이다. 라고 한다. 말 그대로 문자열의 첫번째 Character를 가져다 주는 친구인 것이다. last도 마찬가지이다. 첫번째가 마지막으로 바뀌었을 뿐

아무튼 이 친구를 이용하면 정말 빠르게 해결할 수 있다.

  let _ = testCaseArray.map { value in
    guard let first = value.first,
       let last = value.last
    else { return }
    print("\(first)\(last)")
}

 

위 방법이 정말 쉽지만 다른 방법으로도 한 번 풀어보고 싶어서 index 값을 이용해서 푸는 방식도 한번 해보았다.

(굳이 불편하게 돌아가려는 .... 좋은게 좋은거...)

 

근데 솔직히 index 값 가지고 푸는 것도 딱히 크게 엄청난 일을 하지 않았다. 그저 받은 문자열 개당 개당을 Array로 만들어 주고 그 Array에서 첫번째 값과 마지막 값을 가져와서 print 해준 것 뿐이다.

for i in 0..<testCaseArray.count {
    let array = Array(testCaseArray[i])
    print("\(array[0])\(array[array.count-1])")
}

 

번외 :

근데 여기서 문제가 발생했던게 만약 커맨드라인을 입력하기 전에 한글이었다면, 그리고 지우고 다시 원래 입력하고 했던 문자열을 입력하면 이전에 입력했던 한글이 안지워지고 그대로 출력되는 현상이 발생했다.

Character 크기 문제 때문인지.. 잘 모르겠는데 아무튼.. 요 부분은 한번 생각해봐야할 것같다.

이 영상임...

 

'알록리즘 > BAEKLOG' 카테고리의 다른 글

[1457/Swift] 방 번호  (0) 2023.04.28
[11656/Swift] 접미사 배열  (0) 2023.04.24
[9093/Swift] 단어 뒤집기  (0) 2023.04.24
[1427/Swift] 소트인사이드  (1) 2023.04.18
[1292/Swift] 쉽게 푸는 문제  (0) 2023.04.18