8713번 Znak działania
이왜틀?
1번 틀리고 도망갔다.
어째서 튀었지? 왜 맞서싸우지 않았지?
상대는 기껏해야 브론즈인데!
StringTokenizer st=new StringTokenizer(br.readLine());
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());
int q=a+b;
int w=a-b;
int r=a*b;
int c=0;
if(q==w) c++;
if(w==r) c++;
if(q==r) c++;
if(c>0) bw.write("NIE");
else{
StringBuilder sb=new StringBuilder();
if(q>w&&q>r){
if(a<0) sb.append("(");
sb.append(a+(a<0?")+":"+"));
if(b<0) sb.append("(");
sb.append(b+(b<0?")=":"="));
sb.append(a+b+"");
bw.write(sb.toString());
}else if(w>q&&w>r){
if(a<0) sb.append("(");
sb.append(a+(a<0?")-":"-"));
if(b<0) sb.append("(");
sb.append(b+(b<0?")=":"="));
sb.append(a-b+"");
bw.write(sb.toString());
}else{
if(a<0) sb.append("(");
sb.append(a+(a<0?")*":"*"));
if(b<0) sb.append("(");
sb.append(b+(b<0?")=":"="));
sb.append(a*b+"");
bw.write(sb.toString());
}
}
맙소사 이게 무어람?
도망친 이유를 알 것 같다.
지금 나도 도망치고 싶다.
설계
깨끗하게 처음부터 하는 걸로 치자.
조건은 아래와 같다.
- 두 정수 연산 결과는 최대한 커져야 한다.
- 사용하는 연산 기호는 +, -, * 3개이다.
- 최대가 될 수 있는 경우가 많다면 NIE를 출력한다.
- 음수인 경우 출력 시 괄호로 감싼다.
구현
뭐 음수일때 조건 따져서 하는 것 보다
수가 그리 크지 않으니 그냥 계산 다 때려보는게 빠르고 정확하다.
a, b = map(int, input().split())
sum = a + b
sub = a - b
mul = a * b
max = max(sum, sub, mul)
count = [sum, sub, mul].count(max)
if count > 1:
print("NIE")
else:
print(f"{'(' if a < 0 else ''}{a}{')' if a < 0 else ''}{'+' if max == sum else '-' if max == sub else '*'}{'(' if b < 0 else ''}{b}{')' if b < 0 else ''}={'(' if max < 0 else ''}{max}{')' if max < 0 else ''}")
채점
반성
파이썬은 들여쓰기에 민감해서 printf가 질질 늘어졌다.
너무 보기싫었는데 이것도 방법이 다 있더라.
print(
f"{'(' if a < 0 else ''}{a}{')' if a < 0 else ''}"
f"{'+' if max == sum else '-' if max == sub else '*'}"
f"{'(' if b < 0 else ''}{b}{')' if b < 0 else ''}"
f"{'=(' if max < 0 else '='}{max}{')' if max < 0 else ''}"
)
이렇게 적당히 끊어놓으면 풜씬 보기 좋아진다.
코드 확인