프로그래머스 1단계) 콜라츠추측

2021. 12. 2. 19:39Algorithm/알고리즘

728x90
반응형

문제

첫번째 제출

func solution(_ num:Int) -> Int {
    var num = num
    var sum = 0
    repeat {
        if num % 2 == 0 {
            num = num/2
            sum += 1
        } else {
            num = num * 3 + 1
            sum += 1
        }
    } while (num != 1)

    switch num {
    case 626331:
        return -1
    default:
        return sum
    }
}

두번째 제출

func solution(_ num:Int) -> Int {

    var num = num
    var sum = 0

    repeat {

        if sum == 500 && num != 1 {
            break
        }

        if num % 2 == 0 {
            num = num/2
            sum += 1
        } else {
            num = num * 3 + 1
            sum += 1
        }
    } while (num != 1)

    switch num {
    case 1:
        return sum
    default:
        return -1
    }
}

제출해서 통과한 답안

func solution(_ num:Int) -> Int {

    var num = num
    var sum = 0

   while sum != 500 && num != 1 {

        if num % 2 == 0 {
            num = num/2
            sum += 1
        } else {
            num = num * 3 + 1
            sum += 1
        }
    } 
    
    //500백번 돌렸는데 or 그냥 num이 1이야
    if num == 1 {//num이 1이야
           return sum
       } else { //500백번 돌렸는데 num이 1이 아니야
        return -1
    }
}

최적화 시켜본 답안

func solution(_ num:Int) -> Int {

    var num = num
    var sum = 0

   while sum != 500 && num != 1 {
    var check = num % 2 == 0
       num = check ? num/2 : (num * 3) + 1
       sum += 1
   }   
    sum = num == 1 ? sum : -1
    return sum
}

주의할점

1. check는 bool값을 저장해주는거지 우항과 같은지 비교해보는게 아냐 == -> =로 수정해야함

2. 연산자 사이 띄어쓰기 해줘야해 sum +=1 -> sum += 1

3. 삼항연산자 사용하려면 항상 물음표 앞에는 bool타입이 와야해

 

유의미한 답안

func solution(_ num:Int) -> Int {
    var num1 = num
    var cnt = 0
    while num1 != 1 && cnt != 500{
        var check = num1 % 2 == 0
        num1 = check ? num1 / 2 : (num1 * 3)+1
        cnt+=1
    }
    cnt = num1 == 1 ? cnt : -1
    return cnt 
}

 

느낀점

보니깐..문제를 제대로 안읽는 경향이 있네 "작업을 500번 반복해도 1이되지 않는다면 -1을 반환"이라는 말은 왜 안읽었는지?

문제를 꼼꼼히 읽어보고 푸는자세 매우 중요해.

삼항연산자 이용하는 센스 길러보자

repeat while같은 잘 안쓰는 문법을 쓰는것보다, 좀 익숙하게 많이 쓰이는 문법을 쓰는게 좋겠어.

그리고 똑같은 문제를 읽더라도 지금 받아들이는게 다르니까, 문제를 해석? 하는 능력을 길러보자.

 

이 문제의 "단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요."는

500번까지만 while문을 돌려도 된다는 의미야 맞지.

이것처럼 헷갈렸던 부분. 어떻게 해석해야하는지.

 

할 수있어 까짓거

728x90
반응형