Swift TIL(73)

웰디(Well-D)·2023년 11월 9일
0

Sweet & Soft, SWIFT

목록 보기
73/76

FAQ 스터디

오늘은 가볍게 근황 + 서로 고민했던 부분 공유

마치가 열거형을 한번 더 짚어주어서
1. 연관값과 원시값을 함께 쓸수없다는 것
2. 열거형을 그냥 RPS.rock 쓰는것과 RPS(rawvalue:3) 이렇게 쓰는것은 옵셔널에서 차이가 있다는 것

두가지를 리마인드 할수 있어서 준비해준 마치에게 고마웠다!
그리고 쏭님과도 즐거운 근황토크를 진행했다 :)

나는 velog 에 정리한 내가 고민했던 부분 위주로 공유를 진행함

알고리즘 스터디

리버가 내 git 셋팅부터 homebrew 설치와 git 연동까지 거의 40분 이상을 시간을 내서 도와주었다 (미리 20분전에 만났음에도...오버함)
너무 고맙고 볼때마다 대단한 리버쓰..
홈브류

그리고 다른 스터디원분들도 대단하다고 항상 생각한다(나 저때 뭐했누 싶은 헤헷)
감사하고 인류애 충전하는 스터디 시간

알고리즘 스터디준비

알고리즘 문제 겨우 풀었(이걸 풀었다고 할수있을까...^_^) 다


구밥이의 꿀팁 : 질문게시판을 잘 이용해보자!

참고자료 링크

[iOS] Xcode DocC 사용법
[Swift] 알고리즘에 필요한 Swift Basic 총정리
공식문서 endIndex
[iOS] swift 알고리즘, 코딩테스트에 필요한 tip 정리
파이썬의 enumerate() 내장 함수로 for 루프 돌리기

공식문서 enumerated()
[백준][파이썬]1138번: 한 줄로 서기
스택오버플로우-Type Int does not conform to protocol sequence

결국 마지막에 백준용 제출법을 몰라 찾아봐야 했던

한 줄로 서기 - 백준 1138 - swift
[출처] 한 줄로 서기 - 백준 1138 - swift|작성자 현무

모두모두 감사합니다 휴_휴

풀이를 마크다운으로 정리했다.

가볍게 일단 기록

알쓰 season2 - day1

문제 : 한줄로 서기 백준 1138번

N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.

어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.

사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.

각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.


입력 풀이

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다.

둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다.

i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다. i는 0부터 시작한다.


예제

/*

 4
 2 1 1 0
 >>>
 
 4 2 1 3

-----------
 5
 0 0 0 0 0
 >>>
 
 1 2 3 4 5
 
 
------------ 

 6
 5 4 3 2 1 0
 >>>
 
 6 5 4 3 2 1
  
  */

풀이

예제 하나를 풀어보자

/*
 4
 2 1 1 0

 >>>>>>>
 
 4 2 1 3
*/

첫번째 줄 의미 => 사람의 수 : 4명
두번째 줄 의미
=>
0번째 / 키가 1인 사람 : 왼쪽에 키가 큰 사람이 2명 xx1x   0010
1번째 / 키가 2인 사람 : 왼쪽에 키가 큰 사람이 1명 x2xx.  0210
2번째 / 키가 3인 사람 : 왼쪽에 키가 큰 사람이 1명 xxx3   0213
3번째 / 키가 4인 사람 : 왼쪽에 키가 큰 사람이 0명 4xxx   42134213 출력

여기서 얻을 수 있는 힌트 : // 왼쪽에 몇명이 있는지 보고 그만큼 자리를 비우고 숫자를 채운다

// 입력을 받아오는 코드 

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

// resultArray에 0일 채운다. [ 0 0 0 0 ] 을 만든다. (스위프트는 조금..귀찮게 만들어야함)

var resultArray: [Int] = []
for _ in 0..<totalNumber {
    resultArray.append(0)
}

// 반복문 + enumerated() 메서드를 이용해서 인덱스와 해당 인덱스의 요소를 튜플로 받는다. 

for (i, arrayNumber) in array.enumerated() {
    var count = 0
    /*i : 0 1 2 3   arrayNumber : 2 1 1 0
     
     왼쪽에 arrayNumber 명이 있을때
     1. 앞에 키 큰 사람을 그만큼 0이 비워져 있는지 확인하고, 비워져있다면 i+1을 채운다
     => 0 을 확인하고 0을 i+1 을 대체하는 행위는 resultArray 에서 일어나야하므로  
        루프를 한번 더 돌린다 */

    for (j, resultNumber)  resultArray.enumerated() {
         /*  j : 0 1 2 3   resultArrayNumber : 0 0 0 0

         2. 현재 갯수만큼(arrayNumber만큼) 0이 있는지 확인해야한다.  
            => 원하는 갯수의 0을 찾을 수 있을만큼 루프돌리기
            시도한 방법 1) j == arrayNumber 을 이용해서 조건이 성립할때까지 돌린다.
                      단 j == arrayNumber 을 이용해서 현재 갯수(arrayNumber) 만큼의  
                        0의 갯수를 확인하기 위한 루프를 돌리게 되면 
                        [0210] 인경우에서 빠져나감 (i 가 2 이고 키는 3 일때)
                        (i, arrayNumber) = (2,1) 왼쪽에 0은 한개여야 하는 루프에서  
                        동작하지 않는다
                        따라서 답이 [4 2 1 0] 으로 나오게 됨
                        따라서 원하는 횟수만큼 0을 확인하는 루프를 돌리려면
                        j == arrayNumber조건이 아닌 대체할 조건 하나가 더 필요하다
                        이 조건은 count 로 count 는 최종적으로는 2 1 1 0 즉 
                        arrayNumber와 같게된다. */
        
        // 0 이 있지만 아직 원하는 만큼의 arrayNumber 에 도달하지 못했다면

        if resultNumber == 0 &&  count < arrayNumber {
            // 해당 문이 실행되면서 count 를 올린다
            count += 1   
        }

        /*count를 arrayNumber 만큼 올려놓았으므로 이때  
         (내가 원하는 시점,  
         즉 왼쪽의 0의 갯수인 arrayNumber 과 올려놓은 count가 일치하는 시점에서)
         해당 else if 문이 실행된다.
         이때 그 자리에 i+1 을 넣는다(왜냐면 키는 1부터 시작, i 는 0부터 시작이기 때문이다)*/

        else if  resultNumber == 0 && count == arrayNumber {
            resultArray[j] = i+1
            break
           // 가장 가까운 for 문을 벗어난다 (바깥 for 문으로 돌아간다) 
        }
    }
}

// 다음과 같은 코드를 이용해서 하나하나 문자를 프린트 해줘야 백준에서 정답으로 인식가능 

resultArray.map({String($0)}).forEach{print($0, terminator : " " )}
profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히

2개의 댓글

comment-user-thumbnail
2023년 11월 9일

재밌게 읽고 갑니당 :)

1개의 답글