[코드스쿼드 코코아 과정] 백준 2920번 문제

Kyu·2020년 11월 8일
0

2920번 문제 링크

첫번째 시도

문제를 잘못 이해하고 전혀 다른 방향으로 풀었다. 입력값은 백준에서 예제로 입력하는 것이었지만, 나는 이해를 잘못하고 사용자가 입력하는 게 아니라 처음부터 그 숫자들을 내부적으로 만들어서 입력해줘야 한다고 생각했다. 그래서 랜덤으로 어떻게 숫자들을 만들 수 있는지 검색하여 랜덤클래스를 알게 됐다. for문을 이용해서 입력값 8개를 랜덤으로 얻었다. for문을 이용해 랜덤값을 얻었지만 1~8 각각의 숫자 하나씩만 얻어야하므로 중복된 값을 얻으면 안된다. 이중 for문으로 생성된 랜덤값의 중복된 값이 있으면 다시 생성하도록 했다. 그 다음으로 ascending 과 descending, 즉, 특정한 값이 순서대로 나왔을 때 특정한 값을 어떻게 출력할까 고민을 거듭했지만 답이 나오지 않았다. 처음에는 다음과 같은 프로세스로 문제를 풀고자 했다.

import java.util.Random;
import java.util.Scanner;

public class P2920Messedup {

	public static void main(String[] args) {
			
		Random rd = new Random();
		
		int[] dajangjo = new int[8];
		
		for ( int i = 0; i < 8; i++ ) {
			dajangjo[i] = rd.nextInt(8);
			
			//Check for duplicate numbers
			for ( int j = 0; j < i; j++ ) {
				if ( dajangjo[j] == dajangjo[i]) {
					i--;
					break;
				}
			}
	
		}
			
		//ascending
		Loop1 :
		for ( int k = 0; k < 8; k++ ) {
			if (k + 1 == dajangjo[k]) {
				if (dajangjo[7] == 8) {
					System.out.println("Ascending");
					break Loop1;
				}
				continue;
			}else{
				break;
			}
		}System.out.println("Mixed");
	
	}
}

		
		/*
		 * 숫자 8개를 랜덤으로 입력받아야한다.
		 * 1. 길이가 8인 배열을 생성한다
		 * 2. 그 배열 안에 랜덤으로 숫자를 차례대로 집어넣는다. 어떻게 랜덤으로 숫자를 나오게 하지?!! -> 랜덤클래
		 * 3. 인덱스 0부터 7까지 차례대로 어떤 순서로 나왔는지 판별하고
		 * 		문제에서 요구하는대로 ascending, descending or mixed를 출력한다. 
		 */
		
		/*
		 * 랜덤 클래스에서 나온 숫자를 for문에 의해 dajangjo의 0번인덱스부터 7번인덱스까지 차례대로 넣는다.
		 * 아 근데 숫자는 한번씩만 나와야하는데...어떻게 해결하지? -> 셋클래스, for문
		 * 마지막 for문으로 겹치는 숫자가 있는지 검사했음 일단 겹치지 않는 숫자 8개가 배열에 담겼
		 */


두번째 시도

문제를 다시 한번 잘 읽어보고 처음부터 다시 작성했다. 처음에 삽질하면서 배웠던 게 도움이 되서 쭉쭉 써내려갔다. for문에 8개의 값을 넣을때 앞에서 랜덤클래스 대신에 스캐너클래스를 이용해서 유저에게서 총 8개의 입력 값을 넣었다. 이 때의 경우에는 중복된 값을 생각할 필요가 없다. 이미 유저가 서로 다른 1~8 숫자를 입력할 것이기 때문이다. 그래서 중복된 값을 검사할 필요는 없다.

입력된 값과 비교하기 위해서 ascending, descending 이라는 배열을 미리 만들어 주었다. (근데 배열을 만들어 준 것은 지나다가다 팀원의 코드를 먼저 봐서 생각이 나서 이렇게 사용해버렸다. 문제 풀면서 다른 팀원들의 대화를 들으면 안좋은 점이 있긴하다.) 내 수준에서 이렇게 밖에 비교할 방법이 없긴 하지만..알고리즘 문제는 끝까지 혼자 해보고 싶었다. 어쨋든,

입력된 값과 비교하기 위해서 for 문을 사용해 나름대로의 로직에 따라 코드를 작성했지만 의도대로 작동하지 않았다. 지금 보면 당연한 결과이긴 하다.

import java.util.Scanner;

public class P2920 {

	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		
		int[] a = new int[8];
	
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		sc.close();
		
		int[] ascending = { 1, 2, 3, 4, 5, 6, 7, 8 };
		int[] decending = { 8, 7, 6, 5, 4, 3, 2, 1 };
		
		for (int i2 = 0; i2 < a.length; i2++) {
			if (a[i2] == ascending[i2]) {
				if (a[7] == ascending[7]) {
					System.out.println("ascending");
					break;
				}
				continue;
			}else{
				System.out.println("mixed");
			}
		}
		
		for (int i3 = 0; i3 < a.length; i3++) {
			if (a[i3] == decending[i3]) {
				if (a[7] == decending[7]) {
					System.out.println("decending");
				}
				continue;
		}
		
		}

	}
}

세번째 시도

첫번째 시도에서 처럼 두 배열을 어떻게 비교할까 계속 고민을 했는데 답은 나오지 않았다. 감으로 for문으로 분명히 해결이 될거라고 생각했는데, 내 머리에선 절대 답이 나오지 않았다.. 검색을 통해 (링크) 배열 안의 content를 비교할 수 있는 Arrays 클래스를 찾았다. 그래서 일단 문제의 답은 알아냈는데, 너무 찝찝했다.

🌟 a == b 에서 == 비교 연산자는 주소값을 비교하고,
Arrays.equals() 메소드는 내용 자체(데이터 값)를 비교한다.


package algorithm;

import java.util.Arrays;
import java.util.Scanner;

public class P2920 {

	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		
		int[] a = new int[8];
		
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		sc.close();
		
		int[] ascending = { 1, 2, 3, 4, 5, 6, 7, 8 };
		int[] descending = { 8, 7, 6, 5, 4, 3, 2, 1 };
		
		//배열이 동일한지 비교하려면 Arrays.equals를 사용한다
		//모드 배열 형에 대해 사용가능하다.
		//다차원 배열의 동일성을 확인하려면 Arrays.deepEquals를 사용한다
		//메소드를 사용하는것 말고 for문을 이용해 확인할 방법은 없나?
		
		if (Arrays.equals(a, ascending)) {
			System.out.println("ascending");
		}else if(Arrays.equals(a, descending)) {
			System.out.println("descending");
		}else {
			System.out.println("mixed");
		}

		}

	}

백준에서 다른 사람들의 코드를 보았다. 몇몇은 Arrays를 사용했고, 몇몇 다른 사람들은 for문을 이용했다. 그 중에서 가장 내가 가장 원했던 코드를 소개하고 싶다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int[] um = new int[8];
		for(int i = 0; i < um.length; i++) {
			um[i] = sc.nextInt();
		}
		
		String s = "";
		for(int i =0; i < um.length - 1; i++) {
			if(um[i] == um[i+1] - 1) {
				s = "ascending";
			}
			else if(um[i] == um[i+1] + 1) {
				s = "descending";
			}
			else {
				s = "mixed";
                break;
			}
		}
		System.out.println(s);
		sc.close();
	}
}

소스 출처: https://www.acmicpc.net/source/23695983

내가 for문으로 비교하려 했을 때는 서로 다른 배열(내용물은 같지만)을 가지고 비교하려했다. 근데 하나의 배열만 가지고도 충분히 그 숫자가 오름차순인지 내림차순인지 확인할 수 있었다

profile
TIL 남기는 공간입니다

0개의 댓글