[BOJ 15956] 숏코딩

View as PDF

Submit solution

Points: 4
Time limit: 4.0s
Memory limit: 512M

Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text

코드 페스티벌 온라인 예선에 참가하고 있던 라이언은 이제 남은 시간이 00:00:00밖에 없다는 것을 깨닫게 되었다. 라이언은 이미 머릿속에서 풀이를 구상하고 코딩도 완료했기 때문에, 이를 그대로 타이핑하기만 하면 된다.</p>

지금 라이언은 변수들과 정수들끼리 같은지 다른지 비교하는 간단한 조건문 (conditional expression) S를 작성하고자 한다. 자세히 설명하자면,

  • 라이언이 작성하는 변수의 이름은 영문 알파벳으로만 구성된 문자열이다. 예를 들어, kakao, COde, festival은 변수의 이름이 될 수 있지만, C0de, 2018, hello_world는 변수의 이름이 될 수 없다. 변수는 정수 값을 저장하고 있으며, 변수의 은 해당 변수가 저장하고 있는 정수 값을 의미한다.
  • 라이언이 작성하는 정수는 무조건 -109 이상 109 이하이다. 0을 제외한 정수는 숫자 0으로 시작하지 않으며, 0을 표기하는 유일한 방법은 0이다. 예를 들어, 라이언은 0, 123456, -987654321 과 같은 정수는 작성할 수 있지만, -0, 0123, 00000, -009876, 999999999999999와 같은 정수는 작성할 수 없다.
  • 단항식변수 또는 정수이다.
  • 라이언은 아래 두 개의 비교 연산자를 사용하여 논리식을 만든다.
    • 같음 연산자 ==: <a>==<b>와 같이 사용하며, 두 단항식 <a><b>의 값을 계산하여, 같으면 true를, 다르면 false를 반환한다.
    • 다름 연산자 !=: <a>!=<b>와 같이 사용하며, 두 단항식 <a><b>의 값을 계산하여, 다르면 true를, 같으면 false를 반환한다.
    • 위의 두 연산자 모두, 연산자의 좌변과 우변에는 오직 단항식만이 올 수 있다. 예를 들어, (a==b)!=(b==c)!=의 좌변과 우변에 단항식이 아닌 논리식이 들어 있으므로 라이언이 사용하는 논리식이 아니다.
    </li>
  • 라이언은 논리곱 연산자 &&한 개 이상의 논리식들을 연결하여 조건문을 만든다. 연결한 논리식들이 모두 true를 반환할 때에만 true, 그렇지 않다면 false를 반환하도록 할 것이다. 연결할 때에 공백 등을 삽입하지 않는다. 예를 들어, 라이언이 세 논리식 a==b, b!=c, 1!=a를 연결하고자 한다면, a==b&&b!=c&&1!=a와 같이 연결한다.
  • </ul>

    라이언이 작성하고자 하는 조건문 S는 위 문단에서 언급한 방법으로만 만들 수 있음이 보장된다.

    하지만, 라이언은 남은 시간에 비해 S의 길이가 너무 길다고 생각하여, S와 동치이면서 위에서 제시된 방법으로 만들 수 있는 길이가 가장 짧은 조건문 S'을 대신 입력할 생각이다. 두 조건문 T1T2가 동치라는 것은, 어떤 변수 (조건문에 등장하지 않는 모든 가능한 변수도 포함) 에 어떤 값 (라이언이 작성하지 않는 정수도 가능)을 넣더라도 T1의 참/거짓 여부와 T2의 참/거짓 여부가 같다는 것이다.

    라이언을 위해, S'을 대신 구해주는 프로그램을 작성하자. S'이 여러 가지 있다면, 그 중 하나를 아무거나 구해주면 된다.

    <script> var endTime = new Date("9999-08-04 19:00:00+0900").getTime(); setInterval(function() { var currentTime = new Date().getTime(); var diff = endTime - currentTime; if (diff < 0) diff = 0; var hours = Math.floor(diff / 1000 / 60 / 60) % 24; var minutes = Math.floor(diff / 1000 / 60 % 60); var seconds = Math.floor(diff / 1000 % 60); $("#remaining-time").text(("0" + hours).slice(-2) + ":" + ("0" + minutes).slice(-2) + ":" + ("0" + seconds).slice(-2)); }, 1000);</script> ## 입력 형식

    첫 번째 줄에 라이언이 입력하고자 하는 조건문 S(1 ≤ |S| ≤ 106)가 주어진다.

    출력 형식

    첫 번째 줄에 S와 동치이면서, 문제 본문에 제시된 방법으로 만들 수 있는 길이가 가장 짧은 조건문 S'을 출력한다.

    예제 입력 1

festival==kakao&&festival==2018&&haha==123456&&hoho!=123456

예제 출력 1

festival==2018&&kakao==2018&&haha==123456&&hoho!=haha

예제 입력 2

kakaocodefestival==-20180804&&hello!=-20180804

예제 출력 2

kakaocodefestival==-20180804&&hello!=-20180804

예제 입력 3

a==b&&b==c&&c==a

예제 출력 3

a==b&&a==c

예제 입력 4

int==float

예제 출력 4

int==float

예제 입력 5

a==A&&B==b

예제 출력 5

A==a&&b==B

Comments

There are no comments at the moment.