본문 바로가기
알고리즘/문제풀이

[백준](Swift) 조건문

by venniek 2022. 5. 13.

‘단계별로 풀어보기' 두 번째 단계 조건문이다. if else 문이나 switch문을 사용했다.

1330 두 수 비교하기

정수 A, B를 받아서 두 수를 비교해 부등호 또는 등호를 출력한다. switchA - B를 검사해서 양수, 음수, 그 외의 경우에 따라 출력을 다르게 해줬다.

switch에서 case를 특정 값으로 검사하지 않고 조건으로 검사하려면 where절을 사용하면 된다.

switch 값 {
case let 값을받을이름 where 검사할조건1: 실행문1
case let 값을받을이름 where 검사할조건2: 실행문2
case let 값을받을이름 where 검사할조건3: 실행문3
}

// 예시 point:(Int, Int)
switch point {
    case let (x, y) where x > y : print("x is bigger")
    case let (x, y) where x == y : print("same")
    default : print("y is bigger")
}
// 1330 정답코드
import Foundation

let nums = readLine()!.components(separatedBy: " ").map{ Int($0)! }

switch nums[0] - nums[1] {
    case let x where x < 0 : print("<")
    case let x where x == 0 : print("==")
    default : print(">")
}

9498 시험 성적

점수대에 따라 출력을 다르게 하는 문제다. switch-case에서 case의 값을 범위로 설정할 수도 있다.

let s = Int(readLine()!)!
var g: String

switch s {
    case 90...100: g = "A"
    case 80..<90: g = "B"
    case 70..<80: g = "C"
    case 60..<70: g = "D"
    default: g = "F"
}
print(g)

2753 윤년

연도를 받아서 윤년일 때 1, 아니면 0을 출력한다.

- 윤년의 조건

  1. 4의 배수이면서 100의 배수가 아닐 때 (예.2020년)
  2. 400의 배수 (예.2000년)
let a = Int(readLine()!)!
if (a % 4 == 0 && a % 100 != 0) || a % 400 == 0 {
    print(1)
} else {
    print(0)
}

14681 사분면 고르기

점의 좌표가 주어질 때, 제 1, 2, 3, 4사분면 중 어디에 속하는지 출력한다.

처음에는 x, y좌표의 부호를 모두 검사해 분기를 4개로 나눴는데, 두 수를 곱했을 때 제 1, 3사분면은 그 값이 양수고 제 2, 4사분면은 음수인 점을 활용해 2개로 나눈 후 다시 2개로 나눠줬다.

let x = Int(readLine()!)!
let y = Int(readLine()!)!
let q: Int

if x * y > 0 {
    if x > 0 { q = 1 } else { q = 3 }
} else {
    if x > 0 { q = 4 } else { q = 2 }
}
print(q)

2884 알람시계

입력받은 시간에서 45분 뺀 시간을 구한다. 분이 45분보다 작으면 시를 줄여줘야 하는 점과 0시에서 시를 줄여주면 23시가 된다는 점을 주의해야 한다.

사실 분 단위로 바꿔서 계산하면 음수일 때만 신경써주면 된다. 받은 시간을 분 단위로 바꿔주고 45분을 뺀다. 음수는 원래 시간이 0시 45분 이전인 경우인데, 하루를 넘어갔으니 이때는 24시간을 더해주면 된다.

import Foundation

let nums = readLine()!.components(separatedBy: " ").map{ Int($0)! }
var t = nums[0] * 60 + nums[1] - 45
if t < 0 { t += 1440 }
print(t / 60, t % 60)

2525 오븐 시계

위의 알람시계와 반대로, 시간을 더하는 문제다. 이 문제에서는 더해주는 시간도 입력받아야 한다. 위의 문제와 거의 비슷하게 풀지만 시간을 더해주면 음수가 아니라 24시를 넘어가는 경우가 생기므로, 23시 59분의 분 단위인 1439를 넘어가면 24시간을 빼준다.

import Foundation

let nums = readLine()!.components(separatedBy: " ").map{ Int($0)! }
let time = Int(readLine()!)!
var t = nums[0] * 60 + nums[1] + time
if t > 1439 { t -= 1440 }
print(t / 60, t % 60)

2480 주사위 세개

주사위를 세 개 던져서

  1. 같은 눈이 3개 나오면 10000 + (같은 눈 값) * 1000
  2. 같은 눈이 2개 나오면 1000 + (같은 눈 값) * 100
  3. 다 다르면 (가장 큰 눈 값) * 100

을 받게 된다. 세 숫자를 입력 받아서 상금을 계산하는 문제다. 배열을 만들어서 풀었다.

  • --풀이
  1. 7개짜리 배열(인덱스는 0부터, 눈은 1부터 시작하니까 첫 칸은 버리는 칸)을 만든다.
  2. 입력받은 숫자들을 인덱스로 사용해 배열 요소를 1씩 더해준다.
  3. 인덱스 6부터 1까지 돌면서(다 다르면 가장 큰 값을 쓰니까) 0이면 넘어가고, 1이고 지금까지 ans에 값이 없다면 ans에 계산한 값을 넣어주고 반복하고(더 작은 숫자가 2개 있을 수 있으니), 2나 3이라면 ans를 계산하고 break(더이상 탐색 필요 없으니까)해준다.

ℹ️ 반복문 돌 때 범위연산자를 자주 사용하는데, 이번에는 1부터 6이 아니라 6부터 1을 돌고 싶었다. 이때 범위를 괄호로 감싸고 reversed() 해주면 반대 순서로 사용할 수 있다.

import Foundation

let nums = readLine()!.components(separatedBy: " ").map{ Int($0)! }
var eye = [0, 0, 0, 0, 0, 0, 0]
var ans = 0

for n in nums { eye[n] += 1 }
for i in (1...6).reversed() {
    if eye[i] == 0 { continue }
    else if eye[i] == 1 && ans == 0 { ans = i * 100 }
    else if eye[i] == 2 {
        ans = 1000 + i * 100
        break
    } else if eye[i] == 3 {
        ans = 10000 + i * 1000
        break
    }
}
print(ans)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[백준] (Swift) 2675 문자열 반복  (0) 2022.07.11
[백준](Swift) 1차원 배열  (0) 2022.06.04
[백준](Swift) 반복문  (0) 2022.05.28
[백준](Swift) 입출력과 사칙연산  (2) 2022.05.10
[백준] (C++) 5567 - 결혼식  (0) 2022.01.12

댓글