Today I Learned

백준 swift - 기본 수학1 (1~9단계)

돌맹이시터 2021. 12. 5. 12:59

1712, 2292, 1193, 2869, 10250, 2775, 2839, 10757, 1011

 

 

1712 손익분기점

 

// 1712 손익분기점
let cost = readLine()!.split(separator: " ").map{Int(String($0))!}
var quantity : Int
if cost[1] == cost[2] || cost[1] > cost[2] {
	print(-1)
} else {
	quantity = cost[0]/(cost[2]-cost[1])+1
	print(quantity)
}

 

 

 

 

2292 벌집

 

// 2292 벌집
let input = Int(readLine()!)!
var roomNum = 1
for i in 1...input {
	if input == 1 {
		print(1)
		break
	}
	roomNum += 6*i
	if input <= roomNum {
		print(i+1)
		break
	}
}

 

 

 

1193 분수찾기 (두 가지 코드)

 

// 1193 분수찾기 -1, 304ms, 398108KB

let input = Int(readLine()!)!
var sum = 0
var a:[Int] = [], b:[Int] = []

for i in 1...input {
	if i % 2 != 0 {
		for j in (1...i).reversed() {
			a.append(j)
		}
		for j in (1...i) {
			b.append(j)
		}
		sum += i
	} else {
		for j in (1...i) {
			a.append(j)
		}
		for j in (1...i).reversed() {
			b.append(j)
		}
		sum += i
	}
	if sum >= input {
		break
	}
}
print(a[input-1], "/", b[input-1], separator: "")

 

첫 번째 코드 - 304ms, 398108KB

시간이 오래 걸렸고 메모리도 많이 잡아먹었다.

분자/분모 배열을 생성, 하나씩 숫자를 넣은 후 input에 해당하는 index 값을 출력

 

 

// 1193 분수찾기 -2, 8ms, 62224KB
 
var input = Int(readLine()!)!
var count = 1
while input > count {
	input -= count
	count += 1
}
if count % 2 != 0 {
	print("\(count-input+1)/\(input)")
} else {
	print("\(input)/\(count-input+1)")	
}

 

 

두 번째 코드 - 8ms, 62224KB

훨씬 시간이 적게 걸리고, 코드도 간단하며 메모리를 적게 먹었다.

 

인덱스 값이 몇 번째 대각선(i)에 들어가는지 확인하기 위해 대각선을 증가시켜가며 input에서 빼나간다. input이 i보다 작아지는 순간의 i가 input이 들어가게 될 대각선의 줄 수가 된다.

 

 

 

2869 달팽이는 올라가고 싶다 (두 가지 코드)

 

 

// 2869 달팽이는 올라가고 싶다 -1, 시간초과 

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var day = 0
var height = 0
while height <= input[2] {
	day += 1
	height += input[0]
	if height >= input[2] {
		break
	} else {
		height -= input[1]
	}
}
print(day)

 

시간 초과로 실패먹은 코드

 

 

// 2869 달팽이는 올라가고 싶다 -2, 8ms
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let height = input[2]
let up = input[0]
let down = input[1]

let day = (height-down)/(up-down)

if (height-down)%(up-down) != 0 {
	print(day+1)
} else {
	print(day)
}

 

 

 

10250 ACM호텔

 

 

// 10250 ACM 호텔 , 8ms
let testNumber = Int(readLine()!)!

for _ in 1...testNumber {
	let input = readLine()!.split(separator: " ").map{Int(String($0))!}
	let h = input[0]
	let w = input[1]
	let n = input[2]

	let floor = (n % h == 0) ? h : n%h
	let roomNum = (n % h == 0) ? n/h : n/h + 1

	if roomNum >= 10 {
		print("\(floor)\(roomNum)")
	} else {
		print("\(floor)0\(roomNum)")
	}
}

 

 

 

2775 부녀회장이 될테야

 

 

// 2775 부녀회장이 될테야
let caseNum = Int(readLine()!)!
var result = 0
for _ in 1...caseNum {
	let k = Int(readLine()!)!
	let n = Int(readLine()!)!
	var array = Array(1...n)
	var tempArray = array
	for _ in 1...k {
		for i in 0..<n {
			for j in 0..<i {
				tempArray[i] += array[j]
			}
		}
		array = tempArray
		}
	print(array[n-1])
}

 

 

 

 

2839 설탕 배달

 

 

// 2839 설탕 배달
var input = Int(readLine()!)!

var count = 0

while true {
	if input%5 == 0 {
		count += input/5
		print(count)
		break
	}
	input -= 3
	count += 1
	if input < 0 {
		print(-1)
		break
	}
}

 

 

 

10757 큰 수 A+B

 

 

// 10757 큰 수 A+B -2, 16ms, 62732KB


let input = readLine()!.split(separator: " ").map{String($0)}
var num1 = Array(input[0].reversed()).map{Int(String($0))!}
var num2 = Array(input[1].reversed()).map{Int(String($0))!}

var result = Array(repeating: 0, count: (num1.count > num2.count ? num1.count : num2.count))
var count = 0
if num1.count > num2.count {
	count = num2.count
} else {
	count = num1.count
}

for i in 0..<num1.count {
	result[i] += num1[i]
}
for i in 0..<num2.count {
	result[i] += num2[i]
}

for i in 0..<result.count-1 {
	if result[i] >= 10 {
		result[i] = result[i]%10
		result[i+1] += 1
	}
}

if result[result.count-1] >= 10 {
	result[result.count-1] = result[result.count-1]%10
	result.append(1)
}

var resultNum = result.reversed().reduce("", {$0+String($1)})
print(resultNum)

 

처음엔 다른 로직으로 코드를 작성했지만 런타임 에러..

오버플로우가 발생하게 되어서 통째로 포기하고 새로 작성한 코드이다.

 

 

 

 

 

1011 Fly me to the Alpha Centauri

 

 

// 1011 Fly me to the Alpha Centauri, 12ms, 62232KB

let caseNum = Int(readLine()!)!

for _ in 1...caseNum {
	var count = 0
	var move = 1
	var distance = 0
	let input = readLine()!.split(separator: " ").map{Int(String($0))!}
	distance = input[1]-input[0]
	while distance/2 >= move {
		distance -= move * 2
		move += 1
		count += 2
	}
	if distance >= 1 && distance <= move {
		count += 1
	} else if distance > move {
		count += 2
	}
	print(count)
}

 

'Today I Learned' 카테고리의 다른 글

백준 swift - 기본 수학2 (1~11단계)  (0) 2021.12.05
백준 swift - 문자열  (0) 2021.10.21
20211006 - 백준 swift - 함수  (0) 2021.10.06
20210930 백준 swift - 1차원 배열  (0) 2021.09.30
20210831 백준 swift - while문  (0) 2021.09.01