문제 풀이를 할 때 마다 계속 추가됩니다.
cmd + F 를 통해 문제번호 찾기를 추천드립니다.
22.03.15 업데이트
22.03.16 업데이트
22.03.17 업데이트
22.03.19 업데이트
22.03.20 업데이트
22.03.21 업데이트
22.03.22 업데이트
아래 깃허브 주소에서 모든 백준 문제풀이를 확인하실 수 있습니다.
https://github.com/SuminPark-developer/BaekJoonPS
백준 Swift 1302번
// MARK: - 1302번
let N = Int(readLine()!)!
var books: [String: Int] = [:]
for _ in 0..<N {
let input = readLine()!
if books.keys.contains(input) { // 이미 팔린적 있으면
books[input]! += 1
}
else { // 팔린적 없으면, 추가
books[input] = 1
}
}
var bestSeller: [String] = []
for book in books {
if book.value == books.values.max()! { // 가장 많이 팔린 책이면,
bestSeller.append(book.key)
}
}
bestSeller.sort(by: <)
print(bestSeller.first!)
백준 Swift 11047번 - 그리디(Greedy)
// MARK: - 11047번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var (N, K) = (input[0], input[1])
var coins: [Int] = []
for _ in 0..<N {
coins.append(Int(readLine()!)!)
}
coins.reverse()
var count: Int = 0
for coin in coins {
count += K / coin
K = K % coin
}
print(count)
백준 Swift 1449번 - 그리디(Greedy)
// MARK: - 1449번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, L) = (input[0], input[1])
var pipe = Array(repeating: false, count: 1001) // 1부터 1000까지.(index 0은 생략)
let leak: [Int] = readLine()!.split(separator: " ").map{Int(String($0))!}
for index in leak {
pipe[index] = true
}
var answer: Int = 0
var index: Int = 0
while index <= 1000 {
if pipe[index] == true { // 새는 곳이면,
index += L // 테이프의 길이 만큼 움직여 줌.
answer += 1 // 테이프 1개 추가.
}
else { // 새는 곳이 아니면,
index += 1
}
}
print(answer)
백준 Swift 11724번(DFS)
// MARK: - 11724번(DFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj = Array(repeating: Array(repeating: false, count: N + 1), count: N + 1)
var check = Array(repeating: false, count: N + 1) // 방문체크
var answer: Int = 0
for _ in 0..<M {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (u, v) = (input[0], input[1])
adj[u][v] = true
adj[v][u] = true
}
func dfs(_ index: Int) {
for next in 1...N {
if (index != next) && (adj[index][next] == true) && (check[next] == false) { // 자기자신X, 연결되어 있고, 방문한 적 없으면,
check[next] = true
dfs(next)
}
}
}
for i in 1...N {
if check[i] == false {
check[i] = true
answer += 1
dfs(i)
}
}
print(answer)
백준 Swift 11724번(BFS)
// MARK: - 11724번(BFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj = Array(repeating: Array(repeating: false, count: N + 1), count: N + 1)
var check = Array(repeating: false, count: N + 1) // 방문 체크
var answer: Int = 0
for _ in 0..<M {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (u, v) = (input[0], input[1])
adj[u][v] = true
adj[v][u] = true
}
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
func bfs(_ startIndex: Int) {
var q = Dequeue([startIndex])
while !q.isEmpty {
let now = q.popFirst()
for next in 1...N {
if (adj[now][next] == true) && (check[next] == false) { // 연결되어 있고, 방문한 적 없으면,
check[next] = true
q.pushLast(next)
}
}
}
}
for i in 1...N {
if check[i] == false {
check[i] = true
answer += 1
bfs(i)
}
}
print(answer)
백준 Swift 2178번
// MARK: - 2178번
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var adj: [[Int]] = []
for _ in 0..<N {
let input = readLine()!.map{Int(String($0))!}
adj.append(input)
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
var visited = Array(repeating: Array(repeating: false, count: M), count: N)
func isValid(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y <= N - 1) && (0 <= x && x <= M - 1)
}
func bfs(_ startY: Int, _ startX: Int) -> Int {
visited[startY][startX] = true // 시작위치 방문 포함.
let q = Dequeue([(startY, startX, 1)])
while !q.isEmpty {
let (y, x, d) = q.popFirst()
if y == N-1 && x == M-1 { // 끝에 도달했으면,
return d
}
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
let nd = d + 1
if isValid(ny, nx) && !visited[ny][nx] && adj[ny][nx] == 1 { // 정상 좌표고, 방문한 적 없고, 길이 갈 수 있으면(1이면),
visited[ny][nx] = true
q.pushLast((ny, nx, nd))
}
}
}
return 1
}
let answer = bfs(0, 0)
print(answer)
백준 Swift 7785번
// MARK: - 7785번
let N = Int(readLine()!)!
var names: Set<String> = []
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map{String($0)}
let (name, state) = (input[0], input[1])
if state == "enter" { // enter
names.insert(name)
}
else if state == "leave" { // leave
if names.contains(name) {
names.remove(name)
}
}
}
let temp = names.sorted(by: >)
for name in temp {
print(name)
}
백준 Swift 1021번
// MARK: - 1021번
class Dequeue<T: Comparable> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
func firstIndex(_ num: T) -> Int {
let newQue = deQueue.reversed() + enQueue
if let i = newQue.firstIndex(where: {$0 == num}) {
return i
}
return 0
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
let position = readLine()!.split(separator: " ").map{Int(String($0))!}
var myQ = Dequeue([0])
for i in 1...N {
myQ.pushLast(i)
}
myQ.popFirst() // 0 제거
var answer: Int = 0
for pos in position {
let index = myQ.firstIndex(pos) // myQ에서의 그 숫자의 index
let count = myQ.count
// index기준으로 전체에서 - 왼쪽으로 가는게 짧은지, 오른쪽으로 가는게 짧은지 비교해서 분기.
if index <= (count / 2) { // 2번 케이스 - (절반 기준으로) 왼쪽으로 가는게 짧으면,
for _ in 0..<index {
myQ.pushLast(myQ.popFirst()) // 맨 앞을 빼서 맨 뒤에 붙임.
answer += 1
}
myQ.popFirst() // 1번 케이스
}
else { // 3번 케이스 - (절반 기준으로) 오른쪽으로 가는게 짧으면,
for _ in 0..<count-index {
myQ.pushFirst(myQ.popLast()) // 맨 뒤를 빼서 맨 앞에 붙임.
answer += 1
}
myQ.popFirst()
}
}
print(answer)
백준 Swift 1158번
Dequeue을 사용하면 되려 시간초과.
그냥 배열 혹은 Arrayslice<Int>(1...N)을 사용해야 함.
// MARK: - 1158번
//class Dequeue<T> {
// var enQueue: [T]
// var deQueue: [T] = []
//
// var count: Int {
// return enQueue.count + deQueue.count
// }
//
// var isEmpty: Bool {
// return enQueue.isEmpty && deQueue.isEmpty
// }
//
// init(_ queue: [T]) {
// enQueue = queue
// }
//
// func pushLast(_ element: T) {
// enQueue.append(element)
// }
//
// func pushFirst(_ element: T) {
// deQueue.append(element)
// }
//
// func popLast() -> T {
// if enQueue.isEmpty {
// enQueue = deQueue.reversed()
// deQueue.removeAll()
// }
// return enQueue.popLast()!
// }
//
// func popFirst() -> T {
// if deQueue.isEmpty {
// deQueue = enQueue.reversed()
// enQueue.removeAll()
// }
// return deQueue.popLast()!
// }
//}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, K) = (input[0], input[1])
var result: [Int] = []
//var myQ = Dequeue(Array(1...N)) // https://stackoverflow.com/questions/34571043/how-to-create-an-array-with-incremented-values-in-swift
//var myQ = ArraySlice<Int>(1...N)
var myQ = Array(1...N)
var index: Int = K - 1 // 빼낼 인덱스.
for _ in 0..<N {
if index >= myQ.count {
index %= myQ.count // modulo
}
let pop = myQ.remove(at: index)
result.append(pop)
index += K - 1 // 빼낼 인덱스 옮김.
}
print("<" + result.map{String($0)}.joined(separator: ", ") + ">")
백준 Swift 2346번
// MARK: - 2346번
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let N = Int(readLine()!)!
let balloons = readLine()!.split(separator: " ").map{Int(String($0))!}
var indexBallons: [(index: Int, value: Int)] = []
for i in 0..<N {
indexBallons.append((i+1, balloons[i]))
}
var myQ = Dequeue(indexBallons)
var answer: [Int] = []
var index: Int = 0
var pop = myQ.popFirst() // 1번 풍선 값.
answer.append(pop.index)
for _ in 1..<N {
if pop.value > 0 { // 풍선이 양수면, 오른쪽으로 이동.
for _ in 0..<pop.value-1 {
myQ.pushLast(myQ.popFirst())
}
pop = myQ.popFirst()
answer.append(pop.index)
}
else { // 풍선이 음수면, 왼쪽으로 이동.
for _ in 0..<abs(pop.value)-1 {
myQ.pushFirst(myQ.popLast())
}
pop = myQ.popLast()
answer.append(pop.index)
}
}
for num in answer {
print(num, terminator: " ")
}
백준 Swift 1406번
// MARK: - 1406번(stack사용)
var stackL = readLine()!.map{String($0)}
var stackR: [String] = []
let M = Int(readLine()!)!
for _ in 0..<M {
let input = readLine()!
// .split이 시간을 잡아 먹음.
// var (command, char) = ("", "")
// if input.contains(" ") { // 문자 입력(P)이면,
// let temp = input.split(separator: " ").map{String($0)}
// (command, char) = (temp[0], temp[1])
// }
// else { // L, D, B 이면,
// command = input
// }
switch input {
case "L":
if !stackL.isEmpty {
stackR.append(stackL.popLast()!)
}
case "D":
if !stackR.isEmpty {
stackL.append(stackR.popLast()!)
}
case "B":
if !stackL.isEmpty {
stackL.removeLast()
}
default: // P일 때,
stackL.append(String(input.last!))
}
}
let answer = stackL + stackR.reversed()
print(answer.joined(separator: ""))
아래 더보기 - 시간초과 코드
더보기
백준 Swift 1406번(시간초과)
// MARK: - 1406번(시간초과)
var input = readLine()!.map{String($0)}
var answer = input
let M = Int(readLine()!)!
var index: Int = input.count
for _ in 0..<M {
let input = readLine()!
var (command, char) = ("", "")
if input.contains(" ") { // 문자 입력(P)이면,
let temp = input.split(separator: " ").map{String($0)}
(command, char) = (temp[0], temp[1])
}
else { // L, D, B 이면,
command = input
}
// print("beforeIndex: \(index)")
switch command {
case "P":
answer.insert(char, at: index)
index += 1
case "L":
if index != 0 { // 커서가 문장의 맨 앞이 아니면,
index -= 1
}
case "D":
if index != answer.count { // 커서가 문장의 맨 뒤가 아니면,
index += 1
}
case "B":
if index != 0 { // 커서가 문장의 맨 앞이 아니면,
answer.remove(at: index-1)
index -= 1
}
default:
print("default는 없음.")
}
// print("afterIndex: \(index)")
}
print(answer.joined(separator: ""))
백준 Swift 1935번
// MARK: - 1935번
import Foundation
let N = Int(readLine()!)!
let input = readLine()!.map{String($0)}
var nums: [Double] = Array(repeating: 0.0, count: 26)
for i in 0..<N {
let num = Double(readLine()!)!
nums[i] = num
}
var stack: [Double] = []
var index: Int = 0
for i in 0..<input.count {
if Int(UnicodeScalar(input[i])!.value) >= 65 && Int(UnicodeScalar(input[i])!.value) <= 97 { // 알파벳을 만났을 때,
stack.append(nums[Int(UnicodeScalar(input[i])!.value) - 65])
}
else { // 기호를 만났을 때,
let back: Double = stack.popLast()!
let front: Double = stack.popLast()!
switch input[i] {
case "+":
stack.append(front + back)
case "-":
stack.append(front - back)
case "*":
stack.append(front * back)
case "/":
stack.append(front / back)
default:
print("default는 없음.")
}
}
}
let answer = stack.first!
print(String(format: "%.2f", answer))
백준 Swift 1874번(풀이1)
// MARK: - 1874번(풀이1)
let N = Int(readLine()!)!
var stack: [Int] = []
var op: [String] = []
var num: Int = 1
for _ in 0..<N {
let input = Int(readLine()!)!
while num <= input {
stack.append(num)
op.append("+")
num += 1
}
if stack.last! == input {
stack.removeLast()
op.append("-")
}
else {
op.append("NO")
break
}
}
if op.contains("NO") {
print("NO")
}
else {
for o in op { // operator 출력.
print(o)
}
}
백준 Swift 1874번(풀이2)
// MARK: - 1874번(풀이2)
let N = Int(readLine()!)!
var numArray: [Int] = []
for _ in 0..<N {
numArray.append(Int(readLine()!)!)
}
var stack: [Int] = []
var operatorArray: [String] = []
var index: Int = 0
for i in 1...N {
stack.append(i)
operatorArray.append("+")
while !stack.isEmpty && stack.last! == numArray[index] { // stack이 비어있지 않고, 스택의 마지막이 pop을 해야하는 정수면,
stack.removeLast()
index += 1
operatorArray.append("-")
}
}
if !stack.isEmpty {
print("NO")
}
else {
for op in operatorArray {
print(op)
}
}
백준 Swift 1764번
// MARK: - 1764번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var setA: Set<String> = []
var setB: Set<String> = []
for _ in 0..<N {
setA.insert(readLine()!)
}
for _ in 0..<M {
setB.insert(readLine()!)
}
var interSet: Set<String> = setA.intersection(setB) // setA와 setB 교집합.
let answer: [String] = Array(interSet).sorted(by: <)
print(answer.count)
for name in answer {
print(name)
}
백준 Swift 10799번
// MARK: - 10799번
let input = readLine()!.map{String($0)}
var index: Int = 0
var stack: [String] = []
var answer: Int = 0
while index < input.count {
if input[index] == "(" && input[index+1] == ")" { // 레이저일 때,
answer += stack.count
index += 2
}
else if input[index] == "(" { // 막대 시작일 때,
stack.append("(")
index += 1
}
else { // 막대 끝일 때,
stack.removeLast()
index += 1
answer += 1 // 막대 값 하나 증가.
}
}
print(answer)
백준 Swift 2304번
// MARK: - 2304번
let N = Int(readLine()!)!
var info: [(coord: Int, height: Int)] = []
var array = Array(repeating: 0, count: 1001)
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
info.append((input[0], input[1]))
array[input[0]] = input[1] // 좌표별 값 대입.
}
info.sort(by: <)
var maxCoord: Int = 0
var maxHeight: Int = 0
for data in info {
if data.height > maxHeight {
maxHeight = data.height // 가장 큰 기둥 높이 저장.
maxCoord = data.coord // 가장 큰 기둥의 위치 저장.
}
}
var answer: Int = 0
var temp: Int = 0
for i in 0..<maxCoord+1 { // 왼쪽 -> 오른쪽(큰기둥)
if array[i] > temp { // 더 큰 기둥을 만나면,
temp = array[i]
}
answer += temp
}
temp = 0
for i in stride(from: 1000, to: maxCoord, by: -1) { // 오른쪽 -> 왼쪽(큰기둥)
if array[i] > temp { // 더 큰 기둥을 만나면,
temp = array[i]
}
answer += temp
}
print(answer)
백준 Swift 2841번
// MARK: - 2841번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, P) = (input[0], input[1])
var lineStack = Array(repeating: Array(repeating: 0, count: 0), count: 7)
var answer: Int = 0
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (line, fret) = (input[0], input[1])
if lineStack[line].isEmpty { // 그 줄의 스택이 비었으면,
lineStack[line].append(fret)
answer += 1
}
else {
if lineStack[line].last! < fret { // 새로운 프렛이 더 크면,
lineStack[line].append(fret)
answer += 1
}
else { // 새로운 프렛이 작은게 들어오면,
while !lineStack[line].isEmpty && lineStack[line].last! > fret { // 새로운 프렛이 더 커질 때까지,
lineStack[line].removeLast()
answer += 1
}
if lineStack[line].isEmpty || lineStack[line].last! != fret { // 스택이 비었거나, 프렛이 마지막과 다를때만 넣음.(같을땐 패스.)
lineStack[line].append(fret) // 새로운 프렛 스택에 추가.
answer += 1
}
}
}
// print("\(i)번째, 값 : \(answer)")
}
print(answer)
백준 Swift 3986번
// MARK: - 3986번
let N = Int(readLine()!)!
var count: Int = 0
for _ in 0..<N {
let input = readLine()!.map{String($0)}
var stack: [String] = []
if input.count % 2 == 1 { // 홀수면, 더 볼 필요도 없이 패스.
continue
}
for ch in input {
if stack.isEmpty { // 스택이 비어있으면,
stack.append(ch)
}
else {
if stack.last! == ch {
stack.removeLast()
}
else {
stack.append(ch)
}
}
}
if stack.isEmpty {
count += 1
}
}
print(count)
백준 Swift 1966번
// MARK: - 1966번
let testCase = Int(readLine()!)!
for _ in 0..<testCase {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var importance = readLine()!.split(separator: " ").map{Int(String($0))!}
var myQ: [(index: Int, priority: Int)] = []
for i in 0..<N {
myQ.append((i, importance[i]))
}
importance.sort(by: <)
var printArray: [Int] = []
while !myQ.isEmpty {
if myQ.first!.priority == importance.max()! { // 중요도가 제일 높은 문서이면,
printArray.append(myQ.removeFirst().index) // 인쇄.
importance.removeLast() // 중요도 제일 높은 숫자 삭제.
}
else {
myQ.append(myQ.removeFirst())
}
}
let answer = printArray.firstIndex(of: M)! + 1
print(answer)
}
반응형
최근댓글