Algorithm/백준 알고리즘

백준_5052 전화번호 목록(자바) / 문자열

미스터로즈 2021. 7. 28. 20:47

시간&메모리 제한

 

문제

 

입력&출력

 

문제풀이

2가지 방법으로 문제풀이를 진행해봤습니다.

package com.back;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Back_5052 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int testCase = Integer.parseInt(br.readLine());
		for (int tc= 0; tc < testCase; tc++) {
			int N = Integer.parseInt(br.readLine());
			String[] st = new String[N];

			for (int i = 0; i < N; i++) {
				st[i] =  br.readLine();
			}
			
			Arrays.sort(st);
			boolean ans = false;
			for (int i = 1; i < N ; i++) {
				if(st[i-1].length()>st[i].length()) {
					String tmp = st[i-1].substring(0, st[i].length());
					if(tmp.equals(st[i])) {
						ans=true;
						break;
					}					
				}else if(st[i-1].length()<st[i].length()) {
					String tmp = st[i].substring(0, st[i-1].length());
					if(tmp.equals(st[i-1])) {
						ans=true;
						break;
					}	
				}else {
					if(st[i-1].equals(st[i])) {
						ans=true;
						break;
					}
				}
			}
			
			if(ans==true) {
				sb.append("NO\n");
			}else {
				sb.append("YES\n");
			}
		}
		System.out.println(sb);
	}
}

 

- 먼저 이 방법은 문자열을 정렬해 놓고 직접 하나씩 비교하는 방법입니다.

 

- 비교를 진행할 때, 문자열의 길이가 서로 다르기 때문에 조건문을 이용해서 문자열 길이 별로 진행을 했습니다.

 

- 저는 subString으로 문자열을 잘라냈는데...

 

- 또는 길이에 따라서 Contain을 이용해서 문제풀이를 좀 더 간단하게 진행할 수 있을거 같습니다.


- 두번째 방법

package com.back;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Back_5052 {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int testCase = Integer.parseInt(br.readLine());
		for (int tc = 0; tc < testCase; tc++) {
			int N = Integer.parseInt(br.readLine());
			boolean ans=false;
			ArrayList<num> arr = new ArrayList<num>();
			for (int i = 0; i < N; i++) {
				String tmp = br.readLine();
				arr.add(new num(tmp));
			}
			Collections.sort(arr);
			
			for (int i = 1; i < N; i++) {
				if(arr.get(i).num.startsWith(arr.get(i-1).num)) {
					ans =true;
					break;
				}
			}
			if(ans==true) {
				sb.append("NO\n");
			}else {				
				sb.append("YES\n");
			}
		}
		System.out.println(sb);
	}
	
	static class num implements Comparable<num> {
		String num;
		public num(String num) {
			super();
			this.num = num;
		}
		@Override
		public int compareTo(num o) {
			return this.num.compareTo(o.num);
		}

	}
}

- String에서 제공하는 메소드 startsWith를 이용하는 방법입니다.

 

- 끝 부분을 비교하는 방법으로는 EndsWith 메소드를 이용하는 방법도 있습니다.