-
[백준] 1181 자바 java개발/코딩테스트 2023. 2. 28. 23:00
첫째 줄에 단어의 개수 N을 입력하고
둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 입력하면
길이가 짧은 것부터 길이가 같으면 사전순서대로 중복을 제거하고 정렬해야한다
코딩테스트를 요새 하기 시작해서 (자바를 손에 익게하려고)
이 문제는 그런말이 없긴 하지만 심지어 어떤 문제는 초등부ㅠㅠ 문제라는데
못풀고 있으면 좀 자괴감
그런 초등생들은 물론 엄청나게 뛰어난 초등부이겠지만
이 문제도 도대체 어떻게 중복제거를 해야할지 감이 안왔는데
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); List<String> words = new ArrayList<>(); for (int i = 0; i < n; i++) { String s = sc.nextLine().trim().toLowerCase(); if (!words.contains(s)) { words.add(s); } } Collections.sort(words, new Comparator<String>() { @Override public int compare(String s1, String s2) { int lenDiff = s1.length() - s2.length(); if (lenDiff != 0) { return lenDiff; } return s1.compareTo(s2); } }); for (String word : words) { System.out.println(word); } } }
일단 전체 코드이다
부분씩 보면
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine();
스캐너 객체 sc부터 생성하고 int n 부터 읽어온다
그리고 이거 하면서 처음 알았는데 nextint 다음에 nextline을 바로 쓰면 하나를 먹고 들어가서
한번 더 저렇게 써줘야 한다고 한다
자꾸 하나를 덜받아서 내가 뭘 잘못한건가 한참 생각했는데
이게 원래 그렇다고...
List<String> words = new ArrayList<>(); for (int i = 0; i < n; i++) { String s = sc.nextLine(); if (!words.contains(s)) { words.add(s); } }
빈 문자열 리스트 words를 먼저 만들고 for문에서 n번 반복하면서 한줄씩 입력받는다
words.contains 앞에 !를 붙여서 s가 words에 포함되어 있지 않으면 words에 추가한다
Collections.sort(words, new Comparator<String>() { @Override public int compare(String s1, String s2) { int lenDiff = s1.length() - s2.length(); if (lenDiff != 0) { return lenDiff; } return s1.compareTo(s2); } });
여기부터 좀 어려운데 comparator 객체를 사용해서 words를 정렬한다
campare는 s1과 s2의 길이를 비교해서 길이가 다르면 s1길이에서 s2길이를 뺀 값을 반환한다
만약에 반환값이 음수면 앞에 오게된다(반환한 값으로 정렬하니까)
그리고 만약 길이가 같으면 사전순서대로 비교한다
for (String word : words) { System.out.println(word); } }
그리고 words에 있는 요소를 하나씩 출력한다
'개발 > 코딩테스트' 카테고리의 다른 글
[백준] 1000 A+B (자바) (0) 2023.03.03 [백준] 11870 좌표 압축(자바) (0) 2023.03.02