이 세계에선 내가 개발자?
[1457/Swift] 방 번호 본문
*** 언어는 Swift! ***
이번엔 문제를 풀면서도 잘 안풀려서 좀 어려웠지만 그래도 기록을 위해서 블로그를 작성해보려고 한다.
사실 더 좋은 방법이 있고, 지금 내가 푼 방법은 썩 마음에 드는 풀이는 아니었다..! 🥲🥲
이번에 풀 문제는 1457번, 방 번호 라는 제목을 가진 문제였다. 자세한 내용은 아래와 같다.

이번 문제는 .. 정말.. 내 기준으로 6과 9 때문에 풀기가 굉장히 어려웠다. 그래도 한 번 쪼개보자
1. 첫째 줄에 다솜이의 방 번호 N이 주어진다.
2. 입력 받은 방 번호를 나눈 후 세트와 비교한다.
3. 세트가 없을 경우 세트를 하나 추가한다.
4. 만약 6과 9의 경우는 서로의 숫자를 사용한다.
여러 가지 방법이 있겠지만 내가 선택한 방법은 가장 쉽고, 기본적인 방법인 세트를 만들어서 비교하는 것이다.
말 그대로 세트 배열을 만들고 입력받은 방 번호와 비교하여 있으면 숫자 갯수를 줄이고 비어있으면 세트를 추가하는 그런 방법이다.
자 그럼 본격적으로 해보자
1. 첫째 줄에 다솜이의 방 번호 N이 주어진다.
방 번호 N을 입력받는다.
let roomNumber = readLine() ?? ""
그리고 여기서 세트 비교를 위해 숫자 비교를 위한 배열과 갯수를 위한 배열을 만든다.
let numberSet: [String] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
var numberCountSet: [Int] = [Int](repeating: 1, count: numberSet.count)
마찬가지로 세트가 추가됐을 때 그 갯수를 세기 위한 변수도 하나 추가해준다.
var setCount: Int = 1
2. 입력 받은 방 번호를 나눈 후 세트와 비교한다.
입력받은 방 번호 roomNumber를 나눈 후 numberSet 배열과 비교한다.
let roomNumberArray: [String] = roomNumber.map { String($0) }
for i in 0..<roomNumberArray.count {
for j in 0..<numberSet.count {
/// 하나씩 비교하면서 numberSet에 갯수가 있는 지 확인
if roomNumberArray[i] == numberSet[j] {
먼저 입력받은 방 번호 만큼 돌면서 해당 방 번호가 numberSet에 있는지 확인한다.
방 번호가 만약 1234 라면 1은 numberSet을 전부 돌면서 1이 있는지 없는지 확인한다.
만약 있다면 미리 만들어 둔 numberCountSet에 하나를 빼준다.
numberCountSet[j] = numberCountSet[j] - 1
3. 세트가 없을 경우 세트를 하나 추가한다.
위 경우는 세트에 해당 숫자의 갯수가 있을 경우이다. 그럼 이제 우리는 숫자를 이미 써버려서 없을 경우를 생각해봐야한다.
먼저 numberCountSet이 0일 경우 세트 갯수를 세기 위해 만들어 두었던 setCount 를 하나 올리고 numberCountSet 전체에 +1을 해준다. 그럼 세트가 하나가 추가된 것 처럼 숫자 갯수가 늘어나게 된다.
setCount += 1
/// numberSet에 하나씩 더 추가
numberCountSet = numberCountSet.map { $0 + 1 }
4. 만약 6과 9의 경우는 서로의 숫자를 사용한다.
자 이제 마지막으로 6과 9의 경우는 서로의 숫자를 사용할 수 있다 라는 조건이 있었다.
이 방법으로 풀 때는 딱히 어렵진 않았지만 코드가 유동적이지 않게 되어서 값이 하나라도 잘못되면 결과도 잘못나올 수도 있는 방법이라 마음에 들진 않았다.
다른 방법으로 풀어보려했지만 6과 9 에서 막혀서 아직은 진행중이다..
if roomNumberArray[i] == "6" && numberCountSet[9] != 0 {
numberCountSet[9] = numberCountSet[9] - 1
break
}
if roomNumberArray[i] == "9" && numberCountSet[5] != 0 {
numberCountSet[5] = numberCountSet[5] - 1
break
}
만약 roomNumberArray의 숫자가 6이고, numberCountSet의 9번째 즉 9의 갯수가 0이 아니라면 9의 숫자 갯수를 대신 가져다쓴다.
다음 코드도 마찬가지로 roomNumberArray의 숫자가 9이고, numberCountSet의 6번째 즉 6의 갯수가 0이 아니라면 6의 숫자 갯수를 대신 가져다쓴다.
위처럼 사용한다면 6의 갯수는 없지만 9의 갯수가 있다면 9를 가져다 쓸 것이다.
둘 다 해당이 안된다면 3번 처럼 세트가 하나 추가될 것이다.
세트와 비교하여 세트 갯수를 구한 코드 전체를 본다면 아래와 같다.
for i in 0..<roomNumberArray.count {
for j in 0..<numberSet.count {
/// 하나씩 비교하면서 numberSet에 갯수가 있는 지 확인
if roomNumberArray[i] == numberSet[j] {
/// 만약 value가 0, 세트가 없을 경우 세트 하나 추가
if numberCountSet[j] == 0 {
if roomNumberArray[i] == "6" && numberCountSet[9] != 0 {
numberCountSet[9] = numberCountSet[9] - 1
break
}
if roomNumberArray[i] == "9" && numberCountSet[5] != 0 {
numberCountSet[5] = numberCountSet[5] - 1
break
}
setCount += 1
/// numberSet에 하나씩 더 추가
numberCountSet = numberCountSet.map { $0 + 1 }
}
/// 있으면 numberCount를 하나 빼기
numberCountSet[j] = numberCountSet[j] - 1
}
}
}
여기까지 하면 만약 방 번호가 666998 이라면 위 for문을 돌면서 세트의 갯수는 아래와 같이 나오게 된다.
[1, 1, 1, 1, 1, 1, 0, 1, 1, 1]
6 : 6 숫자가 하나가 있으니 가져다 쓴다.
[1, 1, 1, 1, 1, 1, 0, 1, 1, 0]
6 : 6 숫자가 없지만 9 숫자가 하나 있으니 9의 것을 가져다 쓴다.
[2, 2, 2, 2, 2, 2, 0, 2, 2, 1]
6 : 6 숫자도 없고, 9 숫자도 없기 때문에 세트가 하나 추가된다. 그리고 추가된 세트에서 6을 가져다 쓴다.
[2, 2, 2, 2, 2, 2, 0, 2, 2, 0]
9 : 9 숫자가 하나 있기 때문에 가져다 쓴다.
[3, 3, 3, 3, 3, 3, 1, 3, 3, 0]
9 : 9 숫자도 없고, 6 숫자도 없기 때문에 세트가 하나 추가된다. 그리고 추가된 세트에서 9를 가져다 쓴다.
[3, 3, 3, 3, 3, 3, 1, 3, 2, 0]
8 : 8 숫자가 3개 있기 때문에 하나 가져다 쓴다.
이런 식으로 숫자 끝까지 돌면 3개의 세트를 썼다는 결론이 나오게 된다.
사실 이번 풀이법이 조금 마음에 들지 않아서 포스팅을 할까 말까 고민했지만 나중에 더 좋은 코드를 작성하기 위해서라도 기록용으로 남겨두려고 한다. 다음에 더 좋은 방법으로 풀게 되었다면 꼭 다시 포스팅을 할 것이다!
그래도 어쨌든 이번에도 한 건 해결!👊
'알록리즘 > BAEKLOG' 카테고리의 다른 글
[2164/Swift] 카드2 (0) | 2023.05.10 |
---|---|
[1920/Swift] 수 찾기 (0) | 2023.05.03 |
[11656/Swift] 접미사 배열 (0) | 2023.04.24 |
[9093/Swift] 단어 뒤집기 (0) | 2023.04.24 |
[1427/Swift] 소트인사이드 (1) | 2023.04.18 |