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

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

이 글을 쓰면서 전체 라인수를 좀 줄여보고자 변경했는데도 라인수가 좀 크다.

저 사이트는 다른이의 답도 볼 수 있는 서비스를 제공하는데 보고 오니 정말 내 소스가 좀 부끄러워진다.

 

 

 

이번 문제는 배열의 탐색을 묻는 문제인가 싶다.

세명의 사람이 있고 

첫번째 사람은 1,2,3,4,5 ... 1,2,3,4,5 순으로 답을 적고

이런식으로 세명의 정답 적는 배열이 주어진다.

 

세명의 점수를 정답 배열에서 계속 비교해야해서 

해당 내용을 난 TestPaper라는 구조체를 만들어 정리했다.

 

그 후 각각의 총점을 계산하고

각각의 점수를 기준으로 정렬하고 가장 앞에 있는 사람을 뽑는것으로 톱을 정하고

혹시 톱과 같은 점수가 있는지 filter함수를 통해 사람을 추가로 뽑았다.

  struct TestPaper {
    let id:Int
    private let loopAnsers:[Int]
    private var loopIndex:Int = 0
    var score = 0
    var answer: Int {
      mutating get {
        let index = loopIndex
        self.loopIndex += 1
        if loopIndex >= loopAnsers.count { self.loopIndex = 0 }
        return self.loopAnsers[index]
      }
    }
    
    init(id:Int,loopAnsers:[Int]) {
      self.id = id
      self.loopAnsers = loopAnsers
    }
  }
  
  func solution(_ answers:[Int]) -> [Int] {
    var people:[TestPaper] = [
      TestPaper(id: 1, loopAnsers: [1,2,3,4,5]),
      TestPaper(id: 2, loopAnsers: [2,1,2,3,2,4,2,5]),
      TestPaper(id: 3, loopAnsers: [3,3,1,1,2,2,4,4,5,5])
    ]
    // calc score
    for answer in answers {
      for index in 0 ..< people.count {
        if answer == people[index].answer {
          people[index].score += 1
        }
      }
    }
    
    // get top
    let top = people.sorted(by: {$0.score > $1.score}).first!
    
    // get result
    var result = [Int]()
    for person in people.filter({ $0.score == top.score}) {
      result.append(person.id)
    }
    return result
  }

중간에 그냥 주석으로 때워도 될부분이 생각나지 않아 이번편은 모든 부분을 소스로 올렸다.

 

아래 링크로 가면 전체 클래스를 볼 수 있다

 

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/MockTest.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/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

 

반응형

전체 뷰 사이즈를 찍어보면

print(self.view.frame.size) // (320.0, 568.0)

 

로 매우 아담한 사이즈가 찍힌다.

 

이 뷰에 텍스트뷰를 하나 넣었는데

텍스트를 넣으면서 해당 화면을 넘어가지않고( 스크롤이 생기기전까지) 컨텐츠를 채워넣으려고하고있다.

해서

textView.contentSize.height 를 

textView.frame.height 를 보면서 계속 넘어가는지 확인하면서 텍스트를 넣었으나

 

이상하게 페이지가 엄청나게 많이 넘어간다

한 두줄 넘어가는 경우면 뭔가 조건문 순서가 잘못됐구나 하는데

넘어가도 너무나 넘어간다

 

해서 

textView.frame.size 를 찍어보면...

(398.0, 772.0) ...

실 뷰의 높이가 568인데 오토레이아웃으로 양옆 위아래 여백넣은 텍스트뷰가 700백이 넘어간다.

 

도대체 왜이러는지 몰라 답답한 상황이라

나중에라도 누군가에게 물어보고싶어 이글을 남긴다.

 

 

추가- 21.04.18 00:34

해당 사이즈는 스토리보드에서 사용하고있는 화면의 크기로 보임.

기존

viewWillAppear 에서 

 

viewDidAppear로 변경하니 정상적으로 크기가 나옴.

 

스토리보드 사용시

스토리보드로 먼저 구성되고 

후에 코드로 나온다고한다.

라이프사이클에서 어느부분이 돌아가는지 복습을 해보자 

 

 

 

반응형

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

머릿속 기억에서는 그냥 거품 네개가 순서대로 뽀글뽀글 올라와서 색을 채우는 단순한 디자인이라 바로 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로 넣는게 제일 편하다....

반응형

+ Recent posts