본문 바로가기
  • 기억의 유한함을 기록의 무한함으로✍️            예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
Algorithm/PS - 백준

[백준 Java] 2596번 비밀편지 (구현, 문자열)

by 제가안난데여♪(´ε`*) 2023. 6. 23.
728x90

 

[Bronze I] 비밀편지 - 2596

문제 링크

성능 요약

메모리: 11476 KB, 시간: 72 ms

분류

구현, 문자열

문제 설명

병현이는 지은이에게 문자 A, B, C, D, E, F, G, H 로 쓰여진 편지를 날마다 보내는데, 컴퓨터로 보내는 비밀편지로, 한 문자마다 0 또는 1인 숫자 여섯 개를 사용하여 보낸다. 둘 사이의 약속은 다음과 같다.

  • A 000000
  • B 001111
  • C 010011
  • D 011100
  • E 100110
  • F 101001
  • G 110101
  • H 111010

병현이가 어느 날 001111000000011100 을 보내면 지은이는 이것을 BAD로 이해하게 된다. 그런데 둘 사이에 약속이 잘 만들어져 있기 때문에, 통신에 문제가 생겨서 한 문자를 표시하는 여섯 숫자 중 어느 한 숫자만 틀리게 오는 경우, 지은이는 원래 보내려는 문자를 알아 낼 수가 있다.

예를 들어 지은이가 000100을 받았을 때, A와 숫자 한자만 다르고, 다른 문자들과는 각각 숫자 두 자 이상이 다르므로 지은이는 이것이 A라고 알아보게 된다.

다만 111111과 같이 모든 문자의 표현과 숫자 두 자 이상이 다른 경우에는 무슨 문자인지 알 수가 없게 된다. 예를 들어 지은이가 011111000000111111000000111111 을 받았을 때, BA 다음에 알아 볼 수 없는 문자가 나오는데. 이 경우 이런 것이 처음 나오는 문자의 위치인 3을 출력한다.

지은이가 받은 편지를 보고 문자들을 알아내어 출력하거나, 모르는 문자가 있는 경우, 이것이 처음 나오는 위치를 출력하는 프로그램을 작성하시오.

입력

첫줄에는 보낸 문자의 개수(10개 보다 작다.)가 입력된다. 다음 줄에는 문자의 개수의 여섯 배 만큼의 숫자 입력이 주어진다.

출력

주어진 입력에서 지은이가 이해한 문자들을 출력하거나, 모르는 문자가 나오는 경우 그런 것이 처음 나오는 위치를 출력한다.

💡 나의 접근

예전이 시도했지만 맞추지 못한 문제 중 하나

브론즈...

비밀편지 풀었다 드디어!

1. 주어진 문자열을 6개씩 잘라 탐색한다.

2. 8개의 문자(a ~ h) 을  한개씩 6개씩 자른 문자열과 비교한다.

3. 비교할 문자열(a~h 중 하나)과 6개로 자른 문자열을 문자단위로 한개씩 비교하여 같은개 몇개인지 센다.

4. 5개라면 a ~h 중에 있을 수 있으므로 그 문자를 저장한다.

5. 6개라면 빼박 그 문자이므로 저장한다.

6. 0 ~ 4개라면 주어진 문자가 아닌 것이므로 몇번째 문자인지 출력하고 끝낸다.

💡 코드

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

public class Main_2596 {
	static int n;
	static String[] abc = { "000000", "001111", "010011", "011100", "100110", "101001", "110101", "100110" };

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		String str = br.readLine();

		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < n; i++) {
			//주어진 문자열에서 6개씩 뽑아오기
			String substr = str.substring(i * 6, (i * 6) + 6);
			int idx = -1;
			
			for (int j = 0; j < abc.length; j++) {
				//abc 배열을 탐색하면서 각 요소에서 몇글자가 동일한지 확인
				int count = 0;
				for (int k = 0; k < 6; k++) {
					if (substr.charAt(k) == abc[j].charAt(k)) {
						count++;
					}
				}
				
				//5글자가 동일하다면 한글자는 바뀐거일수도 있으니 idx에 저장
				if (count == 5) {
					idx = j;
				// 6글자가 동일하다면 완전 일치한 거니까 idx를 abc의 인덱스로 바꾸고 반복문 탈출
				}else if (count == 6) {
					idx = j;
					break;
				}
			}
			
			//동일한 그자의 개수가 5,6개인 요소가 없다면 주어진 문자가 없는 것이므로 몇번째인지 출력하고 끝내기
			if (idx == -1) {
				System.out.println(i + 1);
				return;

			}

			sb.append((char) (idx + 65));

		}
		System.out.println(sb.toString());
	}

}
반응형