본문 바로가기

머리맞대는이야기/백준

[17269] 이름궁합 테스트

반응형

출처

www.acmicpc.net/problem/17269

 

17269번: 이름궁합 테스트

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

www.acmicpc.net

풀이과정

1. 문제에서 주어진 방식대로 문자열 재조합

2. 알파벳에 해당하는 숫자 값 가져옴

3. 재귀함수 만들어서 2개만 남을때까지 더해주고 값 가져오기

 


작성 코드

import java.util.StringTokenizer;
import java.io.*;

public class Main {
	public static int answer1 = 0;
	public static int answer2 = 0;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
        
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
        	st = new StringTokenizer(br.readLine());
		String str1 = st.nextToken();
		String str2 = st.nextToken();

		int[] vals = { 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 };
		String newStr = "";
		int maxLength = 0;
		String result;
        
        	if (N > M)
			maxLength = N;
		else
			maxLength = M;
        
        // 새로 문자열 조합하면서 남은 문자열 뒤에 붙이기
        	for (int i = 0; i < maxLength; i++) {
			if (N > i)
				newStr = newStr + str1.charAt(i);
			if (M > i)
				newStr = newStr + str2.charAt(i);
		}

		int[] newStrAlb = new int[newStr.length()];
		int[] newStrVals = new int[newStr.length()];
		
        // 아래 for문 2개로 새로 조합한 문자열의 알파벳을 숫자값으로 변경
		for (int i = 0; i < newStr.length(); i++)
			newStrAlb[i] = newStr.charAt(i) - 'A';

		for (int i = 0; i < newStrVals.length; i++)
			newStrVals[i] = vals[newStrAlb[i]];
        
        // 숫자값 2개 남을때까지 합산
		dfs(newStrVals, true);

        // 십의 자리 0인 경우 처리
		if (answer1 == 0)
			result = "" +answer2+"%" ;
		else
			result = answer1 + "" + answer2 + "%";
        
		bw.write(result);
		br.close();
		bw.flush();
		bw.close();
	} // Main

	public static void dfs(int[] vals, boolean flag) {
		if (vals.length > 2 && flag == true) {
			flag = true;
			int[] tmp = new int[vals.length - 1];
			for (int i = 0; i < vals.length - 1; i++) {
				tmp[i] = vals[i] + vals[i + 1];
				if (tmp[i] > 0 && tmp[i] >= 10)
					tmp[i] = tmp[i] % 10;
			}
			dfs(tmp, flag);
		} else {
			answer1 = vals[0];
			answer2 = vals[1];
			flag = false;
			return;
		}
	} // dfs
} // class

 

memo

백준도 시작하려고 작성한 첫 문제이다.

백준에서 계속 런타임 에러 발생하는데 도무지 모르겠음...

 

수정 후 정답 처리 받음

-> 문자열 받기 전에 숫자 두개 받는 게 있는데 그걸 처리 안했다. 문제를 끝까지 잘보자!!!!!

미숙해보여도 처음 통과한 재귀함수가 마음에 든다.

반응형

'머리맞대는이야기 > 백준' 카테고리의 다른 글

[7490] 0 만들기  (0) 2020.10.04
[1074] Z  (0) 2020.10.04
[2747] 피보나치 수  (0) 2020.10.03
[1939] 중량제한  (0) 2020.09.30
[1991] 트리순회  (0) 2020.09.30