programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

문제에 테스트케이스가 다양하게 안되있었으면 뭐가 틀렸는지 모르고 끙끙 거렸을거같네요.

 

이번 문제는 큐는 어떻게 동작하는가에 대한 문제입니다.

스위프트에는 스택과 큐를 따로 자료형으로 정의되어 있지 않는걸로 알기에 따로 구현을 해서 할까 하다가 그냥 진행했습니다.

문제는 별 이상없이 이해가 되는데 문제에 제시된 예시용 표때문에 이게 무슨소리인가 난감해졌었습니다.

문제의 표처럼 하지말고

아래 처럼 하는게 문제 이해가 쉽습니다

 

지나는중의 숫자 뒤의 괄호는 현재 지나는 정도를 나타내봤습니다

문제에 제시된 다리길이가 10일경우 괄호의 수가 10이 되야 지난 트럭에 들어갑니다.

아래표는 다리 길이가 2이고 최대하중에 10입니다. 지난 트럭은 안적었습니다.

시간 대기중 지나는중
0 7 4 5 6  
1 4 5 6 7(0)
2 4 5 6 7(1)
3 5 6 4(0)
4 6 4(1) 5(0)
5 6 5(1)
6   6(0)
7   6(1)

 

계속 루프 해주면서 대기중에 있는 애가 지나는중 배열에 들어갈 수 있는가를 체크하고

지나는중의 배열에 있는 애는 다 지나갔는지 체크해주면 됩니다.

 

  struct Truck {
    let weight:Int
    var position:Int = 0
  }
  
  func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    func totalTruckWeight(truckArray:[Truck]) -> Int {
      var result = 0
      for item in truckArray {
        result += item.weight
      }
      return result
    }
    
    var passingArray = [Truck]() // 지나는 도중인 트럭을 저장할 배열
    var endArray = [Truck]() // 도착한 트럭을 저장할 배열
    var truckArray = [Truck]()  // 모든 트럭을 넣어둘 배열 
    
    // 매개변수로 받은 애들 Truck구조체 형태로 변경해주기
    
    var waitArray:[Truck] = truckArray // 대기중인 트럭을 넣어두는 배열
    var time = 0 // 반환할 값, 전체 지난 시간
    
    while endArray.count < truckArray.count {
      if passingArray.count > 0 {
      	// 트럭들 포지션 변화
		// 도착한애들 빼주기
      }
      if waitArray.count > 0 {
        // 대기 중인 애들 다리에 올리기 
      }
      time += 1
    }
    return time
  }

 

 

전체 소스는 아래 링크에 있습니다.

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/TruckPassingBridge.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

반응형

문제: 크레인 인형뽑기 게임 (programmers.co.kr/learn/courses/30/lessons/64061)

 

문제는 엄청 긴데 실상 요약해보자면 간단하다

 

2차원 배열이 주어졌을때 x의 값으로 y값 루프를 돌 수 있는가

 

 

우선 기본으로 주어지는건 

board:[[Int]] 와

moves:[Int] 이다.

그리고 추가로 선언할 배열 basket이 필요하다.

 

moves의 값을 foreach로 받으면서

0이 아닌 y배열을 찾는 문제이다.

 

아래 배열은 예시로 주어진 배열이다.

0 0 0 0 0
0 0 1 0 3
0 2 5 0 1
4 2 4 4 2
3 5 1 3 1

이 배열에서 만약 moves의 값이 1이 나왔을경우

x값은 첫번째 인덱스인 0으로 주어지고

해당 열을 탐색하고 값을 찾으면 다음 moves값을 받으면 될것이다.

moves값이 1이였으니 찾는 값은 4가 나오고 해당 값을 basket에 넣으면서 이전 넣었던 값과 비교하여 같을경우 두 아이템을 삭제하고 count를 +2 하면 된다.

 

for x in moves {
  let index = x - 1
  for y in 0 ..< board.count {
    if board[y][index] != 0 {
      바스켓값 비교 및 바스켓에 삽입 등 삭제시 카운트 증가
      break
    }
  }
}

 

 

 

해당 내용의 깃허브에 올려놨다.

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/UFOGame.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

반응형

뭔가 거품이 올라와서 차오르는 버튼이 적용된 디자인을 받아 적용해달라고 했다

머릿속 기억에서는 그냥 거품 네개가 순서대로 뽀글뽀글 올라와서 색을 채우는 단순한 디자인이라 바로 Ok했는데

막상 만들고 디자인 예시 보내온거랑 비교해보니 확연히 다르다

뭐 아무튼 그래서 디자인을 변경해보고자 예시용 프로젝트를 만들어서 돌리는데

뭔 설치를 못한다느니 어쩐다느니 검색해보면 빌드파일 삭제하고 시뮬레이터 재시동하면 된다는데 난 전혀 안된다.

 

설명을 잘 읽어보니 제목과 같은 오류가 나고있다.

 

아니 이게 무슨 말인가 나는 cocoapod로 자동관리를 하는데 ;;;

 

Pods프로젝트 파일을 열어보니 진짜 SnapKit의 Info.Plist가 잡혀있지않는다.

 

Pod를 재설치하면 되겠거늘 하고 재설치를 해봤으나 여전히 해당 파일은 다운로드가 되지않는다.

 

인간성을 땅에 내려놓고 유튜브 영상이나 보면서 마인드 수치를 채우니 다른 프로젝트에서 해당 파일을 복사하자 라는 생각이 들어 

 

파일내용자체를 남겨두려고 이글을 쓴다

 

원래는 아래 사진과 같이

하단 SnapKit폴더의 Support Files에 SnapKit-Info파일이 있어야한다.

 

재설치해도 해당 파일이 생성안된다면 그냥.... 이렇게 생성해주자 

 

원래 있어야하는 위치에 New File을 눌러주고

 

Preperty List 로 하나 생성해준다 

 

 

이름은 SnapKit-Info.plist로 지정해주고 타겟은 둘다 선택해준다. 

 

생성됐으면 해당 파일을 Source Code모드로 열어준다.

 

 

아래 내용을 복붙 저장

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>5.0.1</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>${CURRENT_PROJECT_VERSION}</string>
  <key>NSPrincipalClass</key>
  <string></string>
</dict>
</plist>

 

 

Pods의 프로젝트 파일을 xcode상에서 열어보면 SnapKit 의 Info 파일이 선택되지 않았다고 아래와 같이 뜬다.

Choose Info.plist File... 을 눌러주자

 

 

위에서 생성한  파일을 선택 해준다,.

 

선택하고 다른 타깃을 보고 오거나 하면 아래와같이 다시 잘 보인다,

 

 

마지막으로 잘됐는지 빌드해본다.

 

잘된다.. 만세

반응형
    guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
    extensionContext?.open(url, completionHandler: { (success) in
      if !success {
        var responder = self as UIResponder?
        while (responder != nil){
          let selectorOpenURL = NSSelectorFromString("openURL:")
          if responder?.responds(to: selectorOpenURL) == true {
            _ = responder?.perform(selectorOpenURL, with: url)
          }
          responder = responder?.next
        }
      }
    })

 

열기 실패시에 대한 내용에 대해 자세히 알고싶어져 저장

나중에 찾아보자.

반응형

 

  enum Vibration {
        case error
        case success
        case warning
        case light
        case medium
        case heavy
        @available(iOS 13.0, *)
        case soft
        @available(iOS 13.0, *)
        case rigid
        case selection
        case oldSchool

        public func vibrate() {
            switch self {
            case .error:
                UINotificationFeedbackGenerator().notificationOccurred(.error)
            case .success:
                UINotificationFeedbackGenerator().notificationOccurred(.success)
            case .warning:
                UINotificationFeedbackGenerator().notificationOccurred(.warning)
            case .light:
                UIImpactFeedbackGenerator(style: .light).impactOccurred()
            case .medium:
                UIImpactFeedbackGenerator(style: .medium).impactOccurred()
            case .heavy:
                UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
            case .soft:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .soft).impactOccurred()
                }
            case .rigid:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
                }
            case .selection:
                UISelectionFeedbackGenerator().selectionChanged()
            case .oldSchool:
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }
    }

stackoverflow.com/questions/26455880/how-to-make-iphone-vibrate-using-swift/57162220

 

How to make iPhone vibrate using Swift?

I need to make the iPhone vibrate, but I don't know how to do that in Swift. I know that in Objective-C, you just write: import AudioToolbox AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); But

stackoverflow.com

 

반응형

기본 UIImage로 바로 변환되는 파일이 아니여서 

바로 pb.image로 넣지 못하고

파일을 데이터로 변환해준다음  setData로 해당 타입과 데이터를 넣음

 

      let item = self.imageItems[indexPath.item]
      let pb = UIPasteboard.general
      pb.items = []
      do {
        let data = try Data(contentsOf: item.fileUrl)
        pb.setData(data, forPasteboardType: kUTTypePNG as String)
        if pb.image != nil {
          print("OK")
        }
      } catch let err {
        print("Error, \(err.localizedDescription)")
      }

 

그냥 pb.image로 넣는게 제일 편하다....

반응형

"" 과 ""은 다른문자입니다.

 

이전에 키보드를 만들다 말았었다.

https://github.com/wiwi-git/FirstKeyboard

 

wiwi-git/FirstKeyboard

키보드 만들어보기... Contribute to wiwi-git/FirstKeyboard development by creating an account on GitHub.

github.com

 

한글 영문 둘다 지원하게 만들려고했고

처음 기획은 메인으로 설치되는 앱에 글자를 매칭해두면

해당 매칭되는 글로 키보드가 배열되는걸 만들고싶었다. 기본은 아이폰이전에 내가 쓰던 LG폰의 기본 자판으로 하려고했었고....

뭐 여튼 중요기능은 LG기본 자판의 롱터치로 특수문자입력하기다

 

완성한다고 쳐도 애플이 이건 기본 자판으로도 충분합니다 라며 기본기능 카피에대한 앱의 리젝사유를 주면서 거부할거같고

이전에 키보드는 커스텀으로 만들수가 없는걸까 궁굼해서 만들기 시작한것도 있어서 그냥 단순히 완결은 생각안하고 만들기 시작했었다

 

이전 이야기는 그만하고 이글을 쓰고있는 이유는

한글 자모의 유니코드 때문이다.

 

한글이 입력되려면 이전에 입력되고있는 애들에 조합이 되어야해서 상당히 골치아파졌다

그래서 이전에 그냥 거기서 그만뒀었고 

키보드관련 일을 잡게되서 이전에 만들었던게 생각나서 완성시켜놓을까 하고 다시 잡고있다.

 

일단 한글 자모는

초성 중성 종성으로 세부분으로 나뉘고

이게 유니코드가 

각각

자음이나 모음 하나로된 문자 하나

자음이나 모음으로 이루어지려고하는 문자하나 로 나뉘는듯 보인다

 

해당글은 문제가 생겨 찾던중

https://winplz.tistory.com/entry/%ED%95%9C%EA%B8%80-%EC%9E%90%EC%9D%8C-%EB%B9%84%EA%B5%90%EA%B0%99%EC%A7%80%EB%A7%8C-%EB%8B%A4%EB%A5%B8-%EC%9E%90%EC%9D%8C%EB%93%A4

 

같은 모양, 다른 값의 한글 자음

과정. - 연락처에 있는 초성, 중성, 종성을 분류하고 비교하는 과정 중 - 자음으로만 저장된 연락처와 정상적인 연락처를 비교 ex) 'ㄱㄱㄴ' , '가나다' - 두 문자열의 첫번째 초성값들을 비교 - 뽑

winplz.tistory.com

을 보고 알았다.

 

이글에선 각각 5가지의 유니코드가 있다고 했는데 난 두가지로 보고있다 

앞에 43이나 44로 시작하는 애랑 125,126 인가 로 시작하는애들

 

그래서 일단은 각각의 초성 중성 종성 배열을 

두가지의 버전으로 새롭게 만들고있다.

 

뭔가 멋진 방법이 있을거라 생각하지만

모르겠고 복잡해서 하드코딩으로 배열을 만들어두려고한다.

 

아무튼 그렇게 하드코딩하던중 

 

누군가가 유니코드는 

"\u{유니코드}"로 글자로 바꿔요! 라고해서 이걸로했는데

왠 한자가 나오는 사태가 발생했다 

또 찾아보니 위키에서 유니코드표를 제공해주는데 숫자가 다르다.....

 

아래 표가 바로 한글 유니코드표이다

 

이 사진대로 "\u{1100}"을 입력하면 ㄱ이 입력된다.

 

도대체 그럼 이전에 본 유니코드값은 또 무엇인가

난감해지고 또 다른 글들을 뒤적거리며 찾았지만 딱히 나오지않았다

 

물론 저 표를 위의 표대로 변경하면 될것으로 보이나 그건또 왠지 싫다.

 

unicodeScalar값으로 뽑아낸 숫자들로 바로 하고싶어져서

유니코드->문자 방법을 아래와같이 변경했다

Character(UnicodeScalar(4352)!)

이렇게 하면  ㄱ이 입력되고 맨위에 있는링크 같은 모양 다르값 자음 이라는 게시글에 나온 숫자대로 가능하다

해당 숫자를 표로 만들어진게 없나 또 찾아보니 아래 링크에있다 (사용할 표를 복사했다.)

http://utne.nvg.org/w/unicode.html

#4352 #4353 #4354 #4355 #4356 #4357 #4358 #4359
#4360 #4311 #4362 #4363 #4364 #4365 #4366 #4367 #4368 #4369
#4370 #4371 #4372 #4373 #4374 #4375 #4376 #4377 #4378 #4379
#4380 #4381 #4382 #4383 #4384 #4385 #4386 #4387 #4388 #4389
#4390 #4391 #4392 #4393 #4394 #4395 #4396 #4397 #4398 #4399
#4400 #4401 #4402 #4403 #4404 #4405 #4406 #4407 #4408 #4409
#4410 #4411 #4412 #4413 #4414 #4415 #4416 #4417 #4418 #4419
#4420 #4421 #4422 #4423 #4424 #4425 #4426 #4427 #4428 #4429
#4430 #4431 #4432 #4433 #4434 #4435 #4436 #4437 #4438 #4439
#4440 #4441 #4442 #4443 #4444 #4445 #4446 #4447 #4458 #4449
#4450 #4451 #4452 #4453 #4454 #4455 #4456 #4457 #4458 #4459
#4460 #4411 #4462 #4463 #4464 #4465 #4466 #4467 #4468 #4469
#4470 #4471 #4472 #4473 #4474 #4475 #4476 #4477 #4478 #4479
#4480 #4481 #4482 #4483 #4484 #4485 #4486 #4487 #4488 #4489
#4490 #4491 #4492 #4493 #4494 #4495 #4496 #4497 #4498 #4499
#4500 #4501 #4502 #4503 #4504 #4505 #4506 #4507 #4508 #4509
#4510 #4511 #4512 #4513 #4514 #4515 #4516 #4517 #4518 #4519
#4520 #4521 #4522 #4523 #4524 #4525 #4526 #4527 #4528 #4529
#4530 #4531 #4532 #4533 #4534 #4535 #4536 #4537 #4538 #4539
#4540 #4541 #4542 #4543 #4544 #4545 #4546 #4547 #4558 #4549
#4550 #4551 #4552 #4553 #4554 #4555 #4556 #4557 #4558 #4559
#4560 #4511 #4562 #4563 #4564 #4565 #4566 #4567 #4568 #4569
#4570 #4571 #4572 #4573 #4574 #4575 #4576 #4577 #4578 #4579
#4580 #4581 #4582 #4583 #4584 #4585 #4586 #4587 #4588 #4589
#4590 #4591 #4592 #4593 #4594 #4595 #4596 #4597 #4598 #4599
#4600 #4601 #4602 #4603 #4604 #4605 #4606

(참고로 ㅛ 가 #4411로 가 잘못입력되어있다 #4461이다)

뭐 아무튼 그렇게 숫자도 얻었고 

 

진행할것이다.

 

일단 자야지....

반응형
class JSONNull: Codable, Hashable {

    public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
        return true
    }

    public var hashValue: Int {
        return 0
    }

    public init() {}

    public required init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if !container.decodeNil() {
            throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encodeNil()
    }
}

 

반응형

+ Recent posts