[backjoon] 2920.음계

delma·2020년 2월 29일
0

Algorithms

목록 보기
3/12
post-thumbnail

문제

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다.

1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.

연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.


입력

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.


출력

첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.



풀이

1부터 8까지의 숫자가 오름차순인지 내림차순인지 정렬되지 않은 상태인지의 3가지 경우만 확인하면 되는 쉬운 문제다.


처음 풀었을 때는, 배열의 시작이 1이면 ascending과 mixed를 판별하도록
배열의 시작이 8이면 descending과 mixed를 판별하도록
둘 다 아니면 mixed가 되도록 만들었다.


func judgeAscending(_ scale: [Int] ) -> String {
        var sequence = ""
        if scale[0] == 1 {
            for index in 0..<scale.count-1 {
                let element = scale[index]
                if element + 1 != scale[index + 1 ] {
                    return "mixed"
                }
            }
            sequence = "ascending"
        }else if scale[0] == 8 {
            for index in 0..<scale.count-1 {
                let element = scale[index]
                if element - 1 != scale[index + 1 ] {
                    return "mixed"
                }
            }
            sequence = "descending"
        }else {
            return "mixed"
        }
        
        
        return sequence
    }

원하는대로 결과는 잘 나오지만 for문이 중복되고 어느 부분에선 sequence에 값을 넣어주기도 하고 안 넣기도 한다. 그래서 새롭게 다시 코드를 짜봤다.



func judge(_ scale: [Int]) -> String {
        var isAscending = true
        var isDescending = true
        
        for index in 0..<scale.count-1 {
            if scale[index] < scale[index + 1] {
                isDescending = false
            }else if scale[index] > scale[index + 1] {
                isAscending = false
            }
            
        }
        
        if isAscending {
            return "ascending"
        }else if isDescending {
            return "descending"
        }else {
            return "mixed"
        }
        
    }

새롭게 짠 코드는 ascending / descending을 불값으로 판단할 수 있게 했다.
배열의 요소를 탐색시 현재 인덱스의 다음 인덱스가 현재보다 크면 isDescending = false
현재 인덱스의 다음 인덱스가 현재보다 작으면 isAscending = false 가 되도록 하니
앞서 만든 코드보다 중복을 줄이고 간결하게 원하는 값을 얻을 수 있었다


값을 비교해야 하는 경우, for문과 if문으로 분기해서 판단할 수도 있지만
Bool 타입을 이용한다면 좀 더 간단하게 비교할 수 있다.! ➰

profile
🌐Code makes world better

0개의 댓글