CodeClover
[JAVA] 백준 4592_중복을 없애자 본문
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));
}
}
}

'코딩테스트' 카테고리의 다른 글
| [JAVA] 백준 1244_스위치 켜고 끄기 (0) | 2025.04.10 |
|---|---|
| [JAVA] 백준 1251_단어 나누기 (2) | 2025.04.09 |
| [JAVA] 백준 18352_특정 거리의 도시 찾기 (0) | 2025.02.16 |
| [JAVA] 백준 1713_후보 추천 (0) | 2025.02.13 |
| [JAVA] 백준 5212_지구온난화 (0) | 2025.02.12 |