알고리즘/SWEA

SWEA D4 4366 정식이의 은행업무

  • -

SWEA D4 4366 정식이의 은행업무

 

 

문제링크

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWMeRLz6kC0DFAXd&categoryId=AWMeRLz6kC0DFAXd&categoryType=CODE&&&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

* 일단 문제를 정독 하고 1시간 이상 반드시 고민이 필요합니다.

 

동영상 설명

1시간 이상 고민 했지만 아이디어가 떠오르지 않는다면 동영상에서 약간의 힌트를 얻어봅시다.

 

소스 보기

동영상 설명을 보고도 전혀 구현이 안된다면 이건 연습 부족입니다.
소스를 보고 작성해 본 후 스스로 백지 상태에서 3번 작성해 볼 의지가 있다면 소스를 살짝 보세요.

더보기
package se.code.d4;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * @author itsmeyjc
 * @since 2019. 3. 12.
 * @see https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWMeRLz6kC0DFAXd&categoryId=AWMeRLz6kC0DFAXd&categoryType=CODE&&&
 * @mem 17,940 kb
 * @time 109 ms
 * 2진수의 자리를 하나씩 바꿔가며 일단 10진수로 변경해본다.
 * 3진수도 역시 같이 처리하면서 2진수의 변경 값과 3진수의 변경 값이 같은 경우가 발견되면 그게 정답이다.
 * 3^39는 Integer보다 크고 Long 보다 작기 때문에 Long을 이용해서 처리한다.
 */
public class SWEA_D4_4366_정식이의은행업무 {
    static StringBuilder sb = new StringBuilder();

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

        for (int t = 1; t <= tc; t++) {
            long answer = 0;
            //////////////////////////////////////// TC 처리
            String wrong2 = br.readLine();
            String wrong3 = br.readLine();

            char[] char2 = wrong2.toCharArray();
            char[] char3 = wrong3.toCharArray();

            // 가능한 후보군 목록
            List<Long> candidates = new ArrayList<>();

            // 2진수의 한 자리씩 바꿔가며 10진수로 변경
            for (int i = 0; i < wrong2.length(); i++) {
                // 어떤 자릿수를 바꿔본다. 잘못 기억하고 있으니까...
                char2[i] = char2[i] == '0' ? '1' : '0';
                candidates.add(toDigit10(char2, 2));
                // 다시 원복
                char2[i] = char2[i] == '0' ? '1' : '0';
            }

            outer: for (int j = 0; j < char3.length; j++) {
                for (char k = '0'; k < '3'; k++) {
                    char old = char3[j];
                    if (char3[j] != k) {
                        char3[j] = k;// 한번 바꿔보고..
                        // 답을 찾았다면 그만~
                        long digit10 = toDigit10(char3, 3);
                        if (candidates.contains(digit10)) {
                            answer = digit10;
                            break outer;
                        }
                        char3[j] = old;// 원복
                    }
                }
            }

            //////////////////////////////////////////////////
            sb.append("#").append(t).append(" ").append(answer).append("\n");
        }
        System.out.println(sb);
    }

    // 자릿수가 3^39까지이므로 Long의 최대 범위를 넘지 않기 때문에 api를 사용해도 무방하다.
    // return Long.parseLong(String.valueOf(char2), 2);
    static long toDigit10(char[] chars, int digits) {
        long num = 0;
        for (int i = 0, j = chars.length - 1; i < chars.length; i++, j--) {
            num += (chars[i] - '0') * (Math.pow(digits, j));
        }
        return num;
    }

    // END:

    static String src = "1\n" +
                        "1010\n" +
                        "212";
}

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.