티스토리 뷰

알고리즘/백준

[BAEKJOON]17269 이름궁합 테스트

응애~ 개발자 2023. 12. 23. 04:16
728x90
반응형

문제 요약

  • 알고리즘 분류: 수학, 구현
  • 난이도: Bronze1
  • 문제내용:
    • 두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다.
    • 이름이 남 경우 맨 뒤에 적는다.
    • 알파벳을 대응하는 숫자로 바꾸고 각 숫자와 그 숫자의 오른쪽 숫자와 더한 것을 밑에 적는다.
    • 더한 숫자가 10이 넘을 경우엔 일의 자리 수만 남긴다. 이 과정을 반복하여 숫자가 2개만 남았을 때까지 반복 한다.
  • 사이트: https://www.acmicpc.net/problem/17269
 

17269번: 이름궁합 테스트

시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데

www.acmicpc.net

 

문제풀이

  이번 문제는 아래 처럼 2개 남을 때 까지 반목 하면 되서 크게 3개만 구현 하면 된다.

1. 알파벳을 번갈아 적고 남는것은 맨 뒤로 한다.

2. 알파벳 대응 하는 숫자는 변경한다.

3. 2개 남을 때 까지 오른쪽 숫자를 더하고 일의 자리만 남긴다.

 

 1번은 파이썬은 아래 코드 처럼 구현 하기가 쉽다.  A, B중 가장 적은 개수만큼 돌려서 나머지는 index slice로 처리하면 된다.

for i in range(minlenth):
    AB.append(A[i])
    AB.append(B[i])
    
AB += A[minlenth:] + B[minlenth:] # 나머지 알파벳 추가

 하지만 자바는 파이썬 처럼 index slice 이 없어서 아래 메소드를 구현 해줘야 한다.

	public static void restAlphabet(int[] arr, int end) {
		
		for(int i = minlenth; i < end; i++) {
			AB[minlenth + i] = arr[i];
		}
	
	}

 파라미터는 A,. B 중에 큰 것을 넘겨서 나머지를 추가 하면 된다.

 

 2번은 알파벳을 A ~ Z를 1 ~ 26으로 숫자로 계산 해서 매핑 하는 작업을 할것이다. A~Z는 유니코드로 순서대로 되어 있어서 알파벳은 'A' 유니코드를 빼면 1 ~ 26으로 순서대로 할 수 있다. 자세한것은 유니코드나 ASCII코드 표를 참조하면 될것이다.

 python은 ord를 사용하면 유니코드 정수로 변환이 가능하다. 그리고 lambda 식으로 간단하게 표기가 가능하니 알아 두면 유용하게 쓰일것이다.

AB = list(map(lambda x : alp[ord(x) - ord('A')], AB)) # 알파벳을 숫자로 변환

 java는 char 타입에서 연산하면 자동으로 코드 숫자로 인식이 되서 결과값이 숫자로 나온다.

str = st.nextToken();
for(int i = 0; i < N; i++) {
	A[i] = alp[str.charAt(i) - 'A'];
}
str = st.nextToken();
for(int i = 0; i < M; i++) {
	B[i] = alp[str.charAt(i) - 'A'];
}

 3번 째는 2중 for 문으로 처리하면 된다. 처음에는 2자리가 남을 때 까지니까 전체길이에 - 2 만큼 돌리고 그 다음에는

남은 숫자  - 1 만큼 돌리면 된다.

for i in range(wordlenth - 2):
    for j in range(wordlenth - i - 1):
        AB[j] = (AB[j] + AB[j + 1]) % 10
for(int i = 0; i < worldLenth - 2; i++) {
	for(int j = 0; j < worldLenth - i - 1; j++) {
		AB[j] = (AB[j] + AB[j + 1]) % 10;
	}
}

- i - 1은 i 번째  차례때 그 만큼 빠져 나가는 것이고 - 1은 맨 끝 자리는 연산 안하는 것으로 알고 있으면 된다.

 

 복작한 구현 문제가 아니라서  3개를 차례 대로 구현하면 쉽게 구현이 되서 차례대로 구현 하는 연습을 하면 이 문제도 쉽게 풀것이다.

Code

Python

alp = [3, 2, 1, 2, 4, 3, 1, 3, 1, 1, 3, 1, 3, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1]

N, M = map(int, input().split())
A, B = input().split()

minlenth = min(N, M)
AB = []

for i in range(minlenth):
    AB.append(A[i])
    AB.append(B[i])
    
AB += A[minlenth:] + B[minlenth:] # 나머지 알파벳 추가
AB = list(map(lambda x : alp[ord(x) - ord('A')], AB)) # 알파벳을 숫자로 변환
wordlenth = len(AB)

# 궁합 연산
for i in range(wordlenth - 2):
    for j in range(wordlenth - i - 1):
        AB[j] = (AB[j] + AB[j + 1]) % 10

print('{0}%'.format(AB[0] * 10 + AB[1]))

Java

package TestCode;

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

public class Main {
	
	static int[] alp = {3, 2, 1, 2, 4, 3, 1, 3, 1, 1, 3, 1, 3, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1};
	static int[] AB;
	static int minlenth;
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		minlenth = Math.min(N, M); // N, M 최소 길이
		int worldLenth = N + M;
		
		// A, B  문자열 세팅 (문자열 → 숫자로 변환 작업)
		st = new StringTokenizer(br.readLine());
		int[] A = new int[N];
		int[] B = new int[M];
		String str = st.nextToken();
		for(int i = 0; i < N; i++) {
			A[i] = alp[str.charAt(i) - 'A'];
		}
		str = st.nextToken();
		for(int i = 0; i < M; i++) {
			B[i] = alp[str.charAt(i) - 'A'];
		}
		
		// A, B 문자열 합치기
		AB = new int[worldLenth];
		for(int i = 0; i < minlenth; i++) {
			AB[2*i] = A[i]; //홀수 위치
			AB[2*i + 1] = B[i]; // 짝수 위치 작업
		}
		
		restAlphabet(N > M ? A : B , N > M ? N : M);
		for(int i = 0; i < worldLenth - 2; i++) {
			for(int j = 0; j < worldLenth - i - 1; j++) {
				AB[j] = (AB[j] + AB[j + 1]) % 10;
			}
		}
		System.out.println(AB[0] * 10 + AB[1] + "%");
		
	}
	
	/**
	 * 나머지 알파벳 집어 넣는것
	 */
	public static void restAlphabet(int[] arr, int end) {
		for(int i = minlenth; i < end; i++) {
			AB[minlenth * 2 + i - minlenth] = arr[i];
		}
	}
	
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]1920 수 찾기  (3) 2024.01.04
[BAEKJOON]17389 보너스 점수  (2) 2023.12.26
[BAEKJOON]10539 수빈이와 수열  (2) 2023.09.01
[BAEKJOON]15969 행복  (0) 2023.08.27
[BAEKJOON]1926 그림  (2) 2023.03.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함