연습문제(벽과 폭탄)

벽과 폭탄

각 테스트 케이스마다 ‘W’, ‘B’로 이루어진 문자열이 입력된다. B는 폭탄을, W는 벽을 의미하는데, 폭탄이 하나 터지면 폭탄을 중심으로 반경 2칸 이내의 벽이 모두 폭파된다. 이 때 폭탄이 일시에 터졌을 때 폭파되는 벽의 개수를 출력하라. (https://www.hackerearth.com/problem/algorithm/bob-and-bombs-cake-walk/description/)

BWW, BW, WB, WWB에 해당하는 W의 수를 세는 문제이므로, 이는 간단하게 정규식으로 해결할 수 있다.

import re
t = int(input())
r = re.compile(r'W{1,2}(?=B)|(?<=B)W{1,2}')
for _ in range(t):
  s = input()
  g = r.findall(s)
  print(len("".join(list(g))))

문제에서 주어진 수행시간은 5초인데, 대부분의 경우 0.1초 수준에서 해결됐다. 심지어 이런 문항도 순식간에 계산됐다. (https://he-s3.s3.amazonaws.com/media/hackathon/better-programming/problems/5c1a7faa-4-input-5c1a7b6.txt?Signature=nTVmjOymYYGiG1irF1haJJSfQhs%3D&Expires=1465883451&AWSAccessKeyId=AKIAJLE6MUHDYS3HN6YQ)

Swift 버전

되는지는 안해봤다.

import Foundation
let t = Int(readLine()!)!
for _ in 1...t {
  let s = readLine()!
  if let exp = try? NSRegulareExpression(pattern: "W{1,2}(?=B)|(?<=B)W{1,2}", options:[]) {
    var result = 0
    let matches = exp.matchesInString(s, options:[], range:NSMakeRange(0, s.characters.count))
    for match in matches {
      let f = match.rangeAtIndex(0)
      result += f.length
    }
    print(result)
  }
}

정규식 없이 처리하는 방법

된다. (https://paiza.io/projects/RUNGu4B_aWX9GUoEybafYg)
폭탄 왼쪽의 벽이 파괴되는 케이스와 폭탄 오른쪽이 파괴되는케이스를 각각 따져서 진행한다. 한 번에 최대 3개씩 스캔해나가면서 스캔한 범위에서 B의 위치에 따라 1개 혹은 2개의 폭탄이 파괴되면 된다. 유효 폭발을 일으킨 폭탄을 다시 스캔 범위의 첫번째 위치에 오도록 다음 범위를 잡아서 진행해나가면 된다.

let t = Int(readLine()!)!
    for _ in 1...t {
    let s = readLine()!.characters.map{ String($0) }
    let l = s.count
    var i = 0
    var result = 0
    while i < s.count - 2 {
        let p = (s[i], s[i+1], s[i+2])
        switch p {
        case ("W", "W", "B"):
            result += 2
            i += 2
        case ("W", "B", _):
            result += 1
            i += 1
        case ("B", "W", "W"):
            result += 2
            i += 3
        case ("B", "W", "B"):
            result += 1
            i += 2
        default:
            i += 1
        }
    }
    print(result)
}

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop