TIL/알고리즘 공부

백준 1152번 Swift 알고리즘 연습

여의도사노비 2022. 8. 16. 17:32
728x90

이 문제는 처음 풀 당시에 사용했던 코드가 여전히 왜 틀린지 모르겠다...

해서 백준에 질문글을 일단 올려놓은 상태다...

전반적으로 간단한 문제였던 것 같다.

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 값을 받을 때 공백(Space)를 기준으로 나눈다.
  2. 나눈 값들을 array에 저장한다.
  3. 처음 입력 당시 & 입력 마지막 & 입력 중간 중간 이 세가지 케이스에 각각 공백이 사용 가능하므로
  4. 각 케이스마다 입력된 공백을 지워주면 우리가 원하는 String의 개수를 알 수 있다.

 

처음에는 아래와 조금 다른 방식으로 공백이라는 중복값을 array가 인지하지 못하기 때문에

set을 활용하여 공백값을 전부 제거하고 그 중 공백이 포함되는 경우에만 -1을 count에 반영하여 코드를 짰었다.

하지만 어떤 이유인지 아직 이해가 가지 않지만 답이 틀렸고... 아래와 같이 filter를 이용하여 각 원소의 value가 0인 값들은 걸러주었다. (0이면 "" 공백이기 때문에 이를 제거)

 

* 1152번

import Foundation

let str = readLine()!.components(separatedBy: " ")

var arr = str.filter{($0).count > 0}

print(arr.count)

 

 

+ ADD)

import Foundation

var str = readLine()

var arr = str!.components(separatedBy: " ")
var arrToSet: Set = Set(arr)

if arrToSet.contains("") {
    print(arrToSet.count - 1)
} else {
    print(arrToSet.count)
}

이게 틀렸던 코드이다.

그런데 이유를 알았다..

이유는 바로 같은 단어가 여러번 등장한 경우도 횟수에 포함되어야 한다는 것이었다.

내가 사용한 코드는 공백 뿐만 아니라 만약 The man who wants the prize 와 같은 문장에 the 와 the가 중복되어 카운팅 되지 않는 문제가 있는 것이다..!

너무 간단한 문제였는데 전혀 눈치채지 못하고 있다가 코드를 다시 보니 생각이 났다 ^^;;

처음에 왜 틀린지 몰랐을때 너무 답답했는데 뭐가 틀렸는지 알게 되어 매우 다행이다 :)

 

 

정리(Today I Learned)

  1. 특정 Type을 사용할때 그 Type이 가지고 있는 특성을 확실히 알고 쓰자
  2. Set은 중복값을 제거한다. 내가 원하는 중복값만 제거하는 것이 아니라, 전부