(Swift) 백준 1349 뒤집기

SteadySlower·2022년 5월 19일
0

Coding Test

목록 보기
39/305

1439번: 뒤집기

// 뒤집기

// Swift의 String은 index로 접근이 안되므로 Array로 캐스팅한다.
let string = Array(readLine()!)

// 처음으로 시작하는 숫자 (다른 숫자로 바뀔 때마다 
var now = string[0]

// 0 -> 1 혹은 1 -> 0으로 바뀐 횟수
var change = 0

// 두번째 숫자부터 순회하면서 
	// now와 숫자가 다르면 change에 1을 더하고 now를 바꾼다.
for i in 1..<string.count {
    if now != string[i] {
        now = string[i]
        change += 1
    }
}

if change % 2 == 0 {
    print(change / 2)
} else {
    print((change + 1) / 2)
}
  1. 문자열을 모두 뒤집어보면서 구할 수는 없습니다. 규칙성을 찾아봅시다.
  2. 카드가 바뀌는 지점의 숫자와 그에 따른 뒤집기 횟수를 따져봅시다.
    1. 0번 바뀜 (0 / 1) = 0회
    2. 1번 바뀜 (111000) = 1회 → 0이나 1중 아무거나 뒤집으면 됨
    3. 2번 바뀜 (000100) = 1회 → 둘 중에 적은 쪽을 뒤집으면 됨
    4. 3번 바뀜 (00011100001) = 2회 → 둘 중에 아무거나 뒤집으면 됨
    5. 4번 바뀜 (0011001100) = 2회 → 둘 중에 적은 쪽을 뒤집으면 됨
    6. 5번 바뀜 (010101) = 3회 → 둘 중에 아무거나 뒤집으면 됨
    7. 6번 바뀜 (0101010) = 3회 → 둘 중에 적은 쪽을 뒤집으면 됨
  3. 규칙성을 보면 홀짝이 한 세트로 묶여서 1씩 증가하는 홀짝수열의 규칙성을 가지고 있음을 알 수 있습니다.
    1. 이를 일반화하면
      1. 홀수인 경우 (n + 1) / 2
      2. 짝수인 경우 n / 2

⭐️ 규칙성을 발견할 때는 일단 좀 무대포로 적어보는 편이 좋습니다.

☺️  코드에 대한 자세한 내용은 주석을 참고해주세요!

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글