λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[SW Expert Academy] - (D3)4676. λŠ˜μ–΄μ§€λŠ” μ†Œλ¦¬ λ§Œλ“€κΈ°

by 주발2 2020. 6. 7.
λ°˜μ‘ν˜•

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWRKWITqfvIDFAV8&categoryId=AWRKWITqfvIDFAV8&categoryType=CODE

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

μ½”λ“œ

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

public class Solution {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int t = scan.nextInt();
		
		for(int tc=1; tc<=t; tc++) {
			String str = scan.next();
			StringBuilder sb = new StringBuilder(str);
//			StringBuilder sb2 = new StringBuilder(str);
			int H = scan.nextInt();	// μ‚½μž…ν•  ν•˜μ΄ν”ˆμ˜ 갯수
			int[] arr = new int[H]; // ν•˜μ΄ν”ˆμ„ 넣을 μœ„μΉ˜
			
			for(int i=0; i<H; i++) {
				arr[i] = scan.nextInt();
			}
			
			Arrays.sort(arr);
			
			for(int i=0; i<H; i++) {
				sb.insert(arr[i] + i, "-");
//				System.out.println(sb.toString());
//				str = sb.toString();
//				sb = sb2;
			}
			
			System.out.println("#" + tc + " " + sb.toString());
		}
		
		scan.close();
	}

}

풀이

λ¬Έμ œλŠ” λ¬Έμžμ—΄κ³Ό μ‚½μž…ν•  ν•˜μ΄ν”ˆ("-")의 κ°―μˆ˜κ°€ 주어지고, ν•˜μ΄ν”ˆμ˜ 갯수만큼 ν•˜μ΄ν”ˆμ„ 넣을 μœ„μΉ˜κ°€ 주어진닀.

각각의 μœ„μΉ˜μ— 맞게 ν•˜μ΄ν”ˆμ„ μ‚½μž…ν•΄μ£Όλ©΄ λœλ‹€.

 

μš°μ„  문제 ν’€μ΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

String ν΄λž˜μŠ€μ—λŠ” νŠΉμ • μœ„μΉ˜μ— 데이터λ₯Ό μ‚½μž…ν•˜λŠ” λ©”μ†Œλ“œκ°€ μ—†μ–΄μ„œ StringBuilder 클래슀λ₯Ό ν™œμš©ν–ˆλ‹€.

StringBuilder 클래슀의 insert() λ©”μ†Œλ“œλŠ” λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ‘œ μ˜€λ²„λ‘œλ”©μ΄ λ˜μ–΄μžˆλŠ”λ°,

λŒ€ν‘œμ μœΌλ‘œ λ‘κ°œμ˜ λ§€κ°œλ³€μˆ˜μ€‘ 첫번째 λ§€κ°œλ³€μˆ˜μ—λŠ” μ‚½μž…ν•  μœ„μΉ˜, λ‘λ²ˆμ§Έ μœ„μΉ˜μ—λŠ” μ‚½μž…ν•  데이터λ₯Ό λœ»ν•œλ‹€.

즉, StringBuilder.insert(1, "A"); λΌλŠ” λ©”μ†Œλ“œλŠ” 첫번째 μœ„μΉ˜μ— "A"값을 μ‚½μž…ν•˜λΌλŠ” λœ»μ΄λ‹€.

 

ν•˜μ§€λ§Œ λ¬Έμžμ—΄μ„ μ‚½μž…ν•˜λ©΄ 그만큼 λ¬Έμžμ—΄μ˜ 길이도 λŠ˜μ–΄λ‚˜κΈ°μ—, μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ§Œμ•½ 문제의 첫번째 μž…λ ₯처럼 wow, 2 3 2 둜 데이터λ₯Ό μ‚½μž…ν•˜λ©΄ μ•„λž˜μ™€ 같이 좜λ ₯μ΄λœλ‹€.

μ‚½μž…λ λ•Œλ§ˆλ‹€ λ¬Έμžμ—΄μ˜ 길이도 λŠ˜μ–΄λ‚˜κΈ°μ— 이뢀뢄도 생각을 ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

 

μ–΄λ–»κ²Œν• μ§€ 생각해보닀가 StringBuilder 클래슀λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“€μ–΄λ†“κ³  ν•˜λ‚˜μ”© μ‚½μž…ν•΄μ„œ μ €μž₯ν•˜λŠ” μ‹μœΌλ‘œ μƒκ°μ„ν–ˆμ—ˆλ‹€.

				sb.insert(arr[i] + i, "-");
				str = sb.toString();
				sb = sb2;

μœ„ μ½”λ“œμ²˜λŸΌ StringBuilder 클래슀인 sb에 ν•˜μ΄ν”ˆμ„ μ‚½μž…ν•˜κ³ , λ¬Έμžμ—΄μ— μ €μž₯ν•œ ν›„ μ΄ˆκΈ°μ— μž…λ ₯받은 λ¬Έμžμ—΄λ‘œ sb값을 μ„€μ •ν•˜λŠ”κ±°μ˜€λŠ”λ°, 이러면 ν•˜μ΄ν”ˆμ΄ μΆ”κ°€κ°€ λ˜λŠ”κ²ƒμ΄ μ•„λ‹Œ μΌμ‹œμ μΈ κ°’μ˜ λ³€ν™”λ§Œ μžˆμ—ˆλ‹€.

 

생각보닀 해결은 κ°„λ‹¨ν–ˆλ‹€! λ¬Έμžμ—΄μ— ν•˜μ΄ν”ˆμ„ μ‚½μž…ν• λ•Œλ§ˆλ‹€, κ·Έ λ¬Έμžμ—΄μ˜ 길이가 μ¦κ°€ν•˜λ―€λ‘œ λ˜‘κ°™μ΄ μ‚½μž…ν•  μœ„μΉ˜λ₯Ό 늘렀주면 λ˜λŠ” 것이닀!

 

예λ₯Όλ“€μ–΄, wowλΌλŠ” λ¬Έμžμ—΄μ— 2 3 2 μœ„μΉ˜μ— ν•˜μ΄ν”ˆμ„ μ‚½μž…ν•œλ‹€λ©΄ ..

wo-w , wo-w- , wo--w- μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ ν•˜μ΄ν”ˆμ΄ μΆ”κ°€λœλ‹€.

μ‚½μž…ν•  μœ„μΉ˜λ₯Ό λŠ˜λ €μ£ΌλŠ”κ±΄ for문의 λ³€μˆ˜μΈ i값을 더해주면 λœλ‹€.

iλŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ μ²˜μŒμ—λŠ” 0을, κ·Έ ν›„λ‘œλŠ” ν•˜μ΄ν”ˆμ„ λ„£μ„λ•Œλ§ˆλ‹€ i값을 더해주면 λ¬Έμžμ—΄μ΄ μ¦κ°€ν•˜λŠ”κ²ƒκ³Ό λ™μΌν•˜κ²Œ ν•˜μ΄ν”ˆμ„ 넣을 μœ„μΉ˜λ„ μ¦κ°€ν•˜κ²Œλœλ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ 2 3 2 λΌλŠ” ν•˜μ΄ν”ˆμ„ μ‚½μž…ν•  μœ„μΉ˜λ₯Ό 정렬을 ν•΄μ•Όν•œλ‹€.

λ§Œμ•½, wow에 2 3 2λΌλŠ” ν•˜μ΄ν”ˆμ„ μœ„μ˜ κ³Όμ •μœΌλ‘œ μ‚½μž…μ„ ν•œλ‹€λ©΄... sb.insert(arr[i] + i, "-");

i=0 ... sb.insert(2, "-"); ---> wo-w

i=1 ... sb.insert(4, "-"); ---> wo-w-

i=2 ... sb.insert(4, "-"); ---> wo-w-- 

정닡은 wo--w- μ΄μ§€λ§Œ, wo-w-- 둜 였λ₯˜κ°€ λ‚œλ‹€.

 

λ”°λΌμ„œ 정렬을 ν•΄μ£Όκ³ , 값이 μž‘μ€ μˆœμ„œλŒ€λ‘œ ν•˜μ΄ν”ˆμ„ λ„£μ–΄μ£Όλ©΄ λœλ‹€ !

λ°˜μ‘ν˜•

λŒ“κΈ€