본문 바로가기

건승하고있어요/알고리즘

[1차배열] 음계

반응형

문제: 다장조는 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까지 숫자가 한 번씩 등장한다. 

(출처: https://www.acmicpc.net/problem/2920)


그냥 12345678 치면 ascending 87654321 하면 descending 나머지는 mixed 나오게 하라고 하면 끝날 문제를 도레미까지 넣어가며 dmajor를 집어넣어야 했습니까 진정????? ㅡㅡ


저노무 첫째줄에 8개의  숫자가 주어지는 거부터 또 헤맸다. 어제 헤맨 생각에 이번에도 한 줄에 다 받으라는 소린가 하면서 String으로 받아서 char배열로 나누고 또 쇼했는데... 그냥 8번에 걸쳐서 인트로 받으라는 얘기였다. 또 틀렸습니다 엄청 맛보다가 나중에서야 알고 고치느라 오래 걸렸다. 화나는구나. ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 나는 문제를 이해하는게 제일 어려운거 같아... 뭐가 문제야 도대체.....


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int array1 [] = {1,2,3,4,5,6,7,8};
int array2 [] = {8,7,6,5,4,3,2,1};
 
        String oyeh = null;
        int i=0;
        while(i<array.length) {
            if(array[i] == array1[i]) {
                if(i==7) {
                    oyeh = "ascending";
                    break;
                }
                i++;
                
            } else if (array[i] == array2[i]) {
                if(i==7) {
                    oyeh = "descending";
                    break;
                }
                i++;    
                
            } else {
                oyeh = "mixed";
                break;
            }
            
        }
        
        System.out.println(oyeh);
cs




처음부터 인트로 받는 걸 알았다면 이런식으로 코딩하지 않았을텐데, int인줄 모르고 char배열을 일일이 구분해야한다는 생각에 (char에서는 순서구분이 없다고 우선 생각하고.. 아스키는 무시하고..-ㅠ-) 이런식으로 짰는데, 자꾸 틀렸다는거다. 뭐가 문젠지... 역시나 이클립스에서는 계속 맞다고 하는데 어떤 예외가 분명히 있는거라. 그래서 sos를 쳤다. 평생 못 맞출 수도 있을거 같아서 못 맞추는건 괜찮은데 이게 왜 틀린지는 좀 알고 가야 마음에 안정이 찾아올 거 같아서 으으



1 2 3 4 5 6 7 8 ascending 제대로 나온다



8 7 6 5 4 3 2 1 descending도 잘 나온다. 



아무렇게나 친거 mixed 잘 나온다

근데 왜? 왜 자꾸 틀렸대?


찾아줘!!!!!!!!!!! 라고 도와줘!!!!!!!!! 라고 했더니

귀신같이 예외 찾아줌 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

우왘ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

기절

덜덜덜

이런 예외가 있을 줄야

ascending과 descending이랑 겹치는 부분이 있어서 그렇다고.. 물론 뭔말인지는 이해못함

ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

그래서 int로 다시 짰다. 

처음부터 int버전으로 짰음 아주 좋았을텐데

ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ


위에서 String 한 줄로 받던것을 포문 돌려 일일이 8개의 숫자를 받고

그 다음부터 다시 시작했다.

이번에는 각 배열의 크기를 비교해서 글자를 나오게 했다. 


while(i<7)
            if(array[i]<array[i+1]) {
                asc++;
                i++;
                
            }
            else if(array[i]>array[i+1]) {
                dsc++;
                i++;
            } 


원래는 저 더하기들이 없었는데.. 생각해보니 줄어들다가 늘어나는게 동시에 있으면 mixed가 아니라 ascending로 나오게 되겠더라.

그래서 어떻게 할까 고민하다가 결국 cnt집어넣었다. 

그래서 완벽하게 8번 다 채우는 경우만 ascending과 descending이 나올 수 있도록

8을 다 못 채우면 mixed가 나오게끔


 if(asc == 7) {
            System.out.println("ascending");
        } else if(dsc == 7) {
            System.out.println("descending");
        } else {
            System.out.println("mixed");
        }


이렇게 해부렀다. 그랬더니 드디어 맞았다.


와일 i 범위가 왜 저것밖에 안되지(i<7) 할 수 있는데, 입력에서 숫자가 각각 한개씩만 들어간다고 했기 때문에 마지막 숫자는 확인하지 않아도 되기 때무넹 8번이 아닌 7번만 돌렸다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.Scanner;
 
 
public class Dmajor {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int array [] = new int [8];
        int asc = 0;
        int dsc = 0;
        
        for(int i=0 ; i<8 ; i++) {
            array[i] = scan.nextInt();
         }
        int i = 0;
        while(i<7)
            if(array[i]<array[i+1]) {
                asc++;
                i++;
                
            }
            else if(array[i]>array[i+1]) {
                dsc++;
                i++;
            } 
        
        if(asc == 7) {
            System.out.println("ascending");
        } else if(dsc == 7) {
            System.out.println("descending");
        } else {
            System.out.println("mixed");
        }
        
        scan.close();
    }
 
}
 
cs


꼭 이런 방법밖에 없었을까 하는 생각에 모범답안을 구했다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int ascending = 0;
        int descending = 0;
        for (int i = 0; i < 7; i++) {
           if (array[i] < array[i+1]) {
                 ascending = 1;
           } else {
                 descending = 1;
           }
        }
        if (ascending==1 && descending == 1) {
           System.out.println("mixed");
        } else if(ascending == 1) {
           System.out.println("ascending");
        } else {
           System.out.println("descending");
        }
cs


확 줄어들음 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

과연 모범답안 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ


어째서 else만으로 descending이 나올 수 있냐 했더니 

array[i]<array[i+1]의 else는 array[i]>=array[i]이기 때문이고 어차피 같은 숫자는 들어오지 않기 때문에 else만으로도 descending이 될 수 있었다. 그리고 내가 가장 고민했던 부분


if (ascending==1 && descending == 1) {
           System.out.println("mixed");


굳이 덧셈을 하지 않아도 쉽게 만들 수 있었으엉...

.... 이런 방법이!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (기절)




반응형