CodeClover

[JAVA] 백준 4592_중복을 없애자 본문

코딩테스트

[JAVA] 백준 4592_중복을 없애자

coding dew 2025. 4. 7. 16:55

https://www.acmicpc.net/problem/4592


📌 문제 탐색하기

1-99까지 숫자를 추측해서 전송하는 과정에서 전송을 연속해서 눌러 중복된 값을 전송된 경우를 제거하는 문제이다.

1. 입력시, 매번 라인마다 N의 값을 입력받고 N개의 숫자 ( 1-99까지 추측해서 전송한.. )를 입력받고 입력을 끝내고 싶으면숫자 0을 입력해서 종료한다.
2. 출력시, 각 라인에서 첫번째 열에 위치한 N의값 제외 + 연속된 중복 제외 추측한 숫자들 나열 + 마지막에 $ 기호로 마무리한다.

📌코드 설계하기

main함수에서 입력값 조건에 맞춰서 입력 받고 , solution에서 코드 작성.

오답 접근 ) 중복된 숫자를 indexOf() 함수 사용해서  숫자 배열의 현재 위치와 처음 발견된 위치가 동일한지 아닌지 비교해서 중복인 경우 , 중복인 아닌경우 비교하는 방식으로 생각해서 접근함. ( 조건에 동일한 의견으로 초콜릿 망고의 개수 추측한 경우는 없다. 이런게 없는데 ..? 하면서 일단 냅다 코드 작성함 )
정답 접근 ) 연속된 중복값 ( 연속해서 전송버튼 누른 경우만 제외) => 이해 완료! 
모든 숫자의 중복을 제거하는게 아니고 연속해서 나온 동일한 숫자가 있는 경우를 제거하는것이므로 직전의 숫자와 같은지 체크하고 동일한 경우만 해당 숫자 건너뛰어서 answer에 넣어주는 방식으로 진행.

📌 가능한 시간복잡도

시간복잡도....너무 어려워유ㅠ
- 연속된 숫자 체크하기 위해서 입력된 N개의 숫자들을 각각 비교하니까 O(N) 
- nextLine()으로 한줄만 입력이 아니고 여러줄 입력이니까 입력된 줄 개수만큼 반복해서 처리하니까 M개의 줄이라고 하면
=> O(N)*O(M)인가....

📌 정답 코드

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

public class Main {public String solution(String str){
    String answer = "";

    String[] guessNum = str.split(" ");
    String Submitted ="";

    for (String num : guessNum) {
        if(!num.equals(Submitted)) answer +=num+" ";
        Submitted = num;
    }
    answer += "$";
    return answer;
}

    public static void main(String[] args){
        Main T = new Main();
        Scanner sc = new Scanner(System.in);

        while (true){
            String str = sc.nextLine();
            if(str.equals("0")) break;

            String[] line = str.split(" ");
            int N = Integer.parseInt(line[0]);
            String guess = "";

            for (int i = 1; i <= N; i++) {
                guess += line[i] + " ";
            }
            guess = guess.trim();
            System.out.println(T.solution(guess));
        }
    }
}

 

 

📌 오답 코드

indexOf()함수 활용한 전체 중복된 숫자 제거 코드 설계 오답 코드.. 결론, 문제를 잘읽자..ㅎ

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

public class Main {public String solution(String str){
    String answer = "";

    String[] guessNum = str.split(" ");
    String Submitted ="";

    for (String num : guessNum) {
        if (Submitted.indexOf(num) == -1) {
            answer += num + " ";
            Submitted += num;
        }
    }
    answer += "$";
    return answer;
}

    public static void main(String[] args){
        Main T = new Main();
        Scanner sc = new Scanner(System.in);

        while (true){
            String str = sc.nextLine();
            if(str.equals("0")) break;

            String[] line = str.split(" ");
            int N = Integer.parseInt(line[0]);
            String guess = "";

            for (int i = 1; i <= N; i++) {
                guess += line[i] + " ";
            }
            guess = guess.trim();
            System.out.println(T.solution(guess));
        }
    }
}

잘못된 출력값