알고리즘 단련장/소프티어

[소프티어] Yeah, but How? 레벨2 자바 풀이 (한양대 HCPC 2023)

snapcoder 2024. 7. 18. 01:17
728x90
반응형
SMALL

[소프티어] Yeah, but How? 레벨2 자바 풀이 (한양대 HCPC 2023)

 

https://www.acmicpc.net/problem/30884

 

https://softeer.ai/practice/9498

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

위 두개가 같은 문제다.

출제 플랫폼만 다를 뿐.

 

 

 

 

 

같은 소스를 제출하니 둘다 정답이 나왔다.

 

 

출제자가 몇명 안된다. 5명이면 손가락 꼽는건가 싶다

따끈한 문제인지 구글링도 잘 안되고 내가 정리해야겠더라

 

 

 

 

문제 스펙은 아래와 같다.

 

 

1. 수학적 개념이 재밌다.

2. 줄바꿈 함정이 발생할 수 있다. StringBuilder를 쓰면 안그러던데 BufferedWriter는 줄바꿈을 해줘야했다

 

위 이슈로 티스토리에 올리고 싶어진 문제다.

 

코드부터 보자.

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // int n = Integer.parseInt(br.readLine());

        String s = br.readLine();
        
        
        // 1차 고민
        // char c[] = new char[s.length()+1];
        // for(int i=0; i<s.length(); i++){
        //     c[i] = s.charAt(i);
        // }
        // for(int i=0; i<s.length(); i++){
        //     t.push(s.charAt(i));
        // }

        // 2차 고민
        // s = s.replace("()", "(1)");
        // System.out.println(s);
        // s = s.replace(")(", "+");
        // System.out.println(s);

        // 3차 고민
        for(int i=0; i<s.length()-1; i++){
            bw.write(s.charAt(i));
            if(s.charAt(i)=='(' && s.charAt(i+1)==')'){  
                bw.write("1");
                
            }
            if(s.charAt(i)==')' && s.charAt(i+1)=='('){  
                bw.write("+");
            }
        }
        bw.write(s.charAt(s.length()-1));
        bw.newLine();
        
        // List<Integer> list = Arrays.asList(m2);
        // int dap = Collections.frequency(list, min);
        
        // bw.write(String.valueOf(dap));
        bw.close();
    }
}

 

 

 

주석 부분을 보면 고민을 꽤나 했다.

사실 백지에서부터 정답을 맞췄다면 거짓말이다.

힌트가 있었어도 100점까지의 길은 험난했다.

 

 

줄바꿈 이슈가 없었던 코드도 첨부.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        int len = s.length();

        StringBuilder result = new StringBuilder();

        for (int i = 0; i < len - 1; i++) {
            result.append(s.charAt(i));

            if (s.charAt(i) == '(' && s.charAt(i + 1) == ')')
                result.append('1');
            if (s.charAt(i) == ')' && s.charAt(i + 1) == '(')
                result.append('+');
        }
        
        result.append(s.charAt(len - 1));

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

 

 

 

 

 

 

 

일단

1. 코드적 접근

문제를 보면 " 그중 아무거나 하나를 출력한다." 라고 되어있다.

소프티어 테케가 맞지 않아도, 제출시 정답이 될 수 있다.

 

그런데도 계속된 0점.

마지막 부분에   

bw.newLine();

를 추가하니 귀신처럼 100점이 나왔다.

 

2. 수학적 접근

간단한 참조글 : https://velog.io/@jihwan0319/Yeah-but-How-%EB%B0%B1%EC%A4%80-30884

 

Yeah, but How? (백준 30884)

안녕하세요. 오늘은 덧셈식을 만들 거예요. 문제 https://www.acmicpc.net/problem/30884 아이디어 일단 열린괄호, 닫힌괄호가 연속적으로 있는것은 전혀 상관이 없습니다. 그러므로 ()이랑 )(만 처리해주면

velog.io

 

상세한 참조글 ( 2023 HCPC Official Solutions ) : https://u.acmicpc.net/e98182a0-15b3-4a42-bfae-37c4c3b2beb0/Editorial-HCPC-2023.pdf

 

 

 

최초 성공 유저는 4분만에....

728x90
반응형
LIST