오늘의 문제
참가자
코드
박인서
#include <iostream>
int main() {
int TC;
std::cin>>TC;
for(int j = 1; j <= TC; j++) {
int n,k,x=0,y=0;
long long int res=1;
int a[300001];
std::cin>>n>>k;
a[0]=0;
for(int i=1;i<=n;i++) a[i]=a[i-1]+i;
for(int i=1;i<n;i++) a[n+i]=a[n+i-1]+n-i;
for(int i=0;i<k;i++){
char c;
std::cin>>c;
switch(c){
case 'U':
x--;
break;
case 'D':
x++;
break;
case 'L':
y--;
break;
case 'R':
y++;
break;
}
res+=a[x+y];
if(x+y>=n) res-=(x+y-n+1);
switch((x+y)%2){
case 0:
res+=(y+1);
break;
case 1:
res+=(x+1);
break;
}
}
std::cout<<"Case #"<<j<<std::endl<<res<<std::endl;
}
return 0;
}
아이디어
박인서
- 숫자를 일일이 채워 넣을 수 없다.
- 홀짝 마다 규칙성을 나눠서 좌표를 넣으면 그 위치에 해당하는 번호를 가르킬 수 있게 만듬.
- 숫자를 셀 때 대각선에 있는 수의 갯수가 늘어났다가 다시 줄어듦을 잘 확인하여야 됨.