티스토리 뷰
문제 요약
- 알고리즘 분류: 수학, 구현
- 난이도: Bronze1
- 문제내용:
- 두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다.
- 이름이 남 경우 맨 뒤에 적는다.
- 알파벳을 대응하는 숫자로 바꾸고 각 숫자와 그 숫자의 오른쪽 숫자와 더한 것을 밑에 적는다.
- 더한 숫자가 10이 넘을 경우엔 일의 자리 수만 남긴다. 이 과정을 반복하여 숫자가 2개만 남았을 때까지 반복 한다.
- 사이트: https://www.acmicpc.net/problem/17269
문제풀이
이번 문제는 아래 처럼 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];
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[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
- Python
- 알고리즘
- BaekJoon
- Programmerse
- 누적합
- 파이썬
- 조합
- 그리디
- 백준
- 그래프
- 자바
- BFS
- 동적 계획법
- spring-boot
- DFS
- java
- 수학
- Greedy
- 이론
- JSCODE
- level2
- 동적계획법
- 구현
- LeetCode
- 넓이 우선 탐색
- 문자열
- DP
- 배열
- 재귀호출
- 백트레킹
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |