개발을 시작하는 이야기

[BaekJoon] 차량 번호판 1 본문

개발 이야기/Algorithm Study

[BaekJoon] 차량 번호판 1

Teiresias 2022. 5. 26. 21:38

Swift Study 이주의 문제

 

16968번: 차량 번호판 1

00부터 99까지 총 100가지 중에서 00, 11, 22, 33, 44, 55, 66, 77, 88, 99가 불가능하다.

www.acmicpc.net


문제 설명

상도시의 차량 번호판 형식이 주어졌을 때, 가능한 차량 번호판의 개수를 구해보자.

  • 번호판에 사용할 수 있는 숫자는 0, 1, 2, ..., 8, 9이다.
  • 사용할 수 있는 문자는 a, b, c, d, ..., y, z이다.
  • 차량 번호판의 형식은 최대 4글자이고, c와 d로 이루어진 문자열로 나타낼 수 있다.
  • c는 문자가 위치하는 자리, d는 숫자가 위치하는 자리이다.
  • 같은 문자 또는 숫자가 연속해서 2번 나타나면 안 된다.

예를 들어, 형식이 "cd"이면, a1, d4, h5, k4 등이 가능하다. 형식이 "dd"인 경우에 01, 10, 34, 69는 가능하지만, 00, 11, 55, 66은 같은 숫자가 2번 연속해서 불가능하다.

입력

첫째 줄에 차량 번호판의 형식이 주어진다. 형식은 길이가 4보다 작거나 같으며, c와 d로만 이루어져 있다.

출력

첫째 줄에 가능한 차량 번호판의 개수를 출력한다.

 

예제 입력

예제 입력1 예제 출력1
dd 90
00부터 99까지 총 100가지 중에서 00, 11, 22, 33, 44, 55, 66, 77, 88, 99가 불가능하다.
예제 입력2 예제 출력2
cc 650
26*26 = 676가지 중에서 같은 문자가 중복되는 26가지가 불가능하다.
예제 입력3 예제 출력3
dcdd 23400
9*26*90 = 23400

'c'는 문자가 위치하는 자리이므로 26가지가 가능하고,

'd'는 숫자가 위치하는 자리이므로 10가지가 가능하다.

 

연속해서 나타나는 경우 'c'는 (26-1)가지 가능하고, 'd'는 (10-1)가지 가능하다.

func solution(_ s: String) -> Int {
    var num: Int = s.count
    let solve = solve(s)
    var result: Int = 1
    
    for i in 0...num-1 {
        result = solve[i] * result
    }
    
    return result
}

func sliceString(_ str: String, _ length: Int) -> [String] {
    var result: [String] = []
    var temp = ""

    for s in str {
        temp += String(s)
        if temp.count >= length {
            result.append(temp)
            temp = ""
        }
    }
    
    if temp != "" { result.append(temp) }
    return result
}

func solve(_ s: String) -> [Int] {
    var result: [Int] = []
    let slicedString = sliceString(s, 1)
    
    if slicedString[0] == "c" {
        result.append(26)
    } else {
        result.append(10)
    }
    
    for i in 1...s.count-1 {
        if slicedString[i-1] == slicedString[i] {
            if slicedString[i] == "c" {
                result.append(25)
            } else {
                result.append(9)
            }
        } else {
            if slicedString[i] == "c" {
                result.append(26)
            } else {
                result.append(10)
            }
        }
    }
    return result
}​

우럭님 풀이

let input = readLine()!.map{String($0)}
var result = 0

if input[0] == "d" {
	result = 10
} else {
	result = 26
}

for i in 0..<input.count-1 {
	if input[i] == "d" && input[i+1] == "d" {
		result *= 9
	} else if input[i] == "d" && input[i+1] == "c" {
		result *= 26
	} else if input[i] == "c" && input[i+1] == "c" {
		result *= 25
	} else if input[i] == "c" && input[i+1] == "d" {
		result *= 10
	}
}
print(result)

 

map을 사용 안했더니 함수만 복잡해졌다.

map 사용이 아직 자유롭지 않아서 바로 떠오르지 않아서 그렇다고 위안해보지만 좀 더 자주 사용해보도록 하자.


let input = readLine()!.map{ String($0) }
var result = 0

if input[0] == "c" {
    result = 26
} else {
    result = 10
}
    
for i in 1...input.count-1 {
    if input[i-1] == input[i] {
        if input[i] == "c" {
            result *= 25
        } else {
            result *= 9
        }
    } else {
        if input[i] == "c" {
            result *= 26
        } else {
            result *= 10
        }
    }
}

print(result)

map을 사용해서 수정한 코드인데 Xcode의 Playground에서는 실행되는데 백준에선 컴파일오류와 런타임오류가 발생한다.

어디가 문제인걸까...?

'개발 이야기 > Algorithm Study' 카테고리의 다른 글

[BaekJoon] 주사위 세개  (0) 2022.06.02
[BaekJoon] 알람 시계  (0) 2022.06.02
[프로그래머스] 기능개발  (0) 2022.04.29
[프로그래머스] 멀쩡한 사각형  (0) 2022.04.28
[프로그래머스] 오픈채팅방  (0) 2022.04.27