🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 5002_도어맨

λΏŒμ•Ό._. 2024. 6. 19. 14:43

Silver II

문제(좜처: https://www.acmicpc.net/problem/5002)

< 도어맨 >

 

문제 풀이 

 

μ—¬μžμ™€ λ‚¨μžμ˜ 차이λ₯Ό μ΅œμ†Œκ°€ λ˜λ„λ‘ μ—¬μžμ™€ λ‚¨μž 수λ₯Ό 비ꡐ해 적은 성별을 λ¨Όμ € μž…μž₯μ‹œν‚¨λ‹€. λ§Œμ•½ μ‚¬λžŒ μˆ˜κ°€ 적은 성별을 λ¨Όμ € μž…μž₯μ‹œν‚¬ 수 μ—†λ‹€λ©΄ 정인이가 κΈ°μ–΅ν•  수 μžˆλŠ” 차이 λ‚΄μ—μ„œ μ‚¬λžŒ μˆ˜κ°€ λ§Žμ€ 성별을 μž…μž₯μ‹œν‚¨λ‹€.

 

 my solution (Java)

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

public class _5002_ { // 도어맨

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		int x = Integer.parseInt(bf.readLine());

		String str = bf.readLine();
		int w = 0, m = 0, idx1 = 0, idx2 = 1;

		while (Math.abs(m - w) <= x && x != 0) {
			if (idx1 == 0) {
				if (str.charAt(0) == 'M') {
					m += 1;
				} else {
					w += 1;
				}
				idx1 = idx2 + 1;
			}

			if (Math.abs(m - w) > x || (idx1 >= str.length() && idx2 >= str.length())) {
				break;
			}

			boolean flag = false;
			if (m > w) {
				if (idx1 < str.length() && w + 1 - m <= x && str.charAt(idx1) == 'W') {
					flag = true;
					w += 1;
					idx1 = Math.max(idx1, idx2) + 1;
				} else if (idx2 < str.length() && w + 1 - m <= x && str.charAt(idx2) == 'W') {
					flag = true;
					w += 1;
					idx2 = Math.max(idx1, idx2) + 1;
				} else if (idx1 < str.length() && m + 1 - w <= x && str.charAt(idx1) == 'M') {
					flag = true;
					m += 1;
					idx1 = Math.max(idx1, idx2) + 1;
				} else if (idx2 < str.length() && m + 1 - w <= x && str.charAt(idx2) == 'M') {
					flag = true;
					m += 1;
					idx2 = Math.max(idx1, idx2) + 1;
				}
			} else {
				if (idx1 < str.length() && m + 1 - w <= x && str.charAt(idx1) == 'M') {
					flag = true;
					m += 1;
					idx1 = Math.max(idx1, idx2) + 1;
				} else if (idx2 < str.length() && m + 1 - w <= x && str.charAt(idx2) == 'M') {
					flag = true;
					m += 1;
					idx2 = Math.max(idx1, idx2) + 1;
				} else if (idx1 < str.length() && w + 1 - m <= x && str.charAt(idx1) == 'W') {
					flag = true;
					w += 1;
					idx1 = Math.max(idx1, idx2) + 1;
				} else if (idx2 < str.length() && w + 1 - m <= x && str.charAt(idx2) == 'W') {
					flag = true;
					w += 1;
					idx2 = Math.max(idx1, idx2) + 1;
				}
			}
			if (!flag) {
				break;
			}
		}
		System.out.println(m + w);
	}
}
λ³€μˆ˜)
x : κΈ°μ–΅ν•  수 μžˆλŠ” κ°€μž₯ 큰 차이
str : 쀄을 μ„œ μžˆλŠ” μˆœμ„œ
w, m : μž…μž₯ν•œ μ—¬μž, λ‚¨μž μ‚¬λžŒ 수
idx1, idx2 : 쀄을 μ„œ μžˆλŠ” 첫 번째, 두 번째 μ‚¬λžŒ
flag : μž…μž₯ μ—¬λΆ€

 

κΈ°μ–΅ν•  수 μžˆλŠ” κ°€μž₯ 큰 차이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. 쀄을 μ„œ μžˆλŠ” μˆœμ„œλ₯Ό μž…λ ₯λ°›μ•„ μž…μž₯ν•œ μ—¬μžμ™€ λ‚¨μž 수 차이가 xμ΄ν•˜μΌ λ•Œ λ‹€μŒ 과정을 λ°˜λ³΅ν•œλ‹€.

 

1) 제일 μ²˜μŒμ— μž…μž₯ν•  λ•ŒλŠ” μ—¬μžμΈμ§€ λ‚¨μžμΈμ§€ μƒκ΄€μ—†μœΌλ―€λ‘œ 0번째 μ‚¬λžŒμ„ μž…μž₯μ‹œν‚¨λ‹€.

2) μž…μž₯ν•œ μ—¬μžμ™€ λ‚¨μžμ˜ 수 차이가 x보닀 ν¬κ±°λ‚˜ 쀄을 μ„œ μžˆλŠ” λͺ¨λ“  μ‚¬λžŒμ„ λ‹€ μž…μž₯μ‹œμΌ°λ‹€λ©΄ μ’…λ£Œν•œλ‹€.

3) μž…μž₯ν•œ μ‚¬λžŒ 쀑 λ‚¨μž μˆ˜κ°€ 더 λ§Žλ‹€λ©΄

3-1) 쀄 μ„œ μžˆλŠ” μ‚¬λžŒμ˜ 첫 번째 μ‚¬λžŒ, 두 번째 μ‚¬λžŒ μ€‘μ—μ„œ μ—¬μžκ°€ μžˆλ‹€λ©΄ μž…μž₯μ‹œν‚¨λ‹€.

3-2) μ—¬μžκ°€ μ—†κ³  λ‚¨μžλ₯Ό μž…μž₯μ‹œμΌ°μ„ λ•Œ μž…μž₯ν•œ μ—¬μžμ™€ λ‚¨μžμ˜ 차이 μˆ˜κ°€ xμ΄ν•˜λΌλ©΄ λ‚¨μžλ₯Ό μž…μž₯μ‹œν‚¨λ‹€.

4) μž…μž₯ν•œ μ‚¬λžŒ 쀑 μ—¬μž μˆ˜κ°€ 더 λ§Žλ‹€λ©΄

4-1) 쀄 μ„œ μžˆλŠ” μ‚¬λžŒμ˜ 첫 번째 μ‚¬λžŒ, 두 번째 μ‚¬λžŒ μ€‘μ—μ„œ λ‚¨μžκ°€ μžˆλ‹€λ©΄ μž…μž₯μ‹œν‚¨λ‹€.

4-2) λ‚¨μžκ°€ μ—†κ³  μ—¬μžλ₯Ό μž…μž₯μ‹œμΌ°μ„ λ•Œ μž…μž₯ν•œ μ—¬μžμ™€ λ‚¨μžμ˜ 차이 μˆ˜κ°€ xμ΄ν•˜λΌλ©΄ μ—¬μžλ₯Ό μž…μž₯μ‹œν‚¨λ‹€.

5) λ§Œμ•½ 아무도 μž…μž₯μ‹œν‚¬ 수 μ—†λŠ” 상황이라면 μ’…λ£Œν•œλ‹€.

 

μ΅œμ’… μž…μž₯ν•œ μ‚¬λžŒ 수인 m+wλ₯Ό 좜λ ₯ν•œλ‹€.