[[TableOfContents]] = ì˜¤ëŠ˜ì˜ ë¬¸ì œ = [https://www.codeground.org/practice/practiceProbView.do?probId=5|ë¯¸ê¶ ì†ì˜ ë°©] = ì°¸ê°€ìž = * ë°•ì¸ì„œ * 15ì´ì›ì¤€ = 코드 = == ë°•ì¸ì„œ == {{{ #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; } }}} == 15ì´ì›ì¤€ == * 90ì 짜리입니다... ã… {{{ // 아래 기본 ì œê³µëœ ì½”ë“œë¥¼ ìˆ˜ì • ë˜ëŠ” ì‚ì œí•˜ê³ ë³¸ì¸ì´ 코드를 ì‚¬ìš©í•˜ì…”ë„ ë©ë‹ˆë‹¤. #include <cstdio> #include <iostream> #include<cmath> using namespace std; int main(int argc, char** argv) { /* 아래 freopen 함수는 input.txt 를 read only 형ì‹ìœ¼ë¡œ ì—° 후, 앞으로 표준 ìž…ë ¥(키보드) ëŒ€ì‹ input.txt 파ì¼ë¡œ 부터 ì½ì–´ì˜¤ê² 다는 ì˜ë¯¸ì˜ 코드입니다. 만약 본ì¸ì˜ PC ì—서 테스트 í• ë•ŒëŠ”, ìž…ë ¥ê°’ì„ input.txtì— ì €ìž¥í•œ 후 freopen 함수를 사용하면, ê·¸ 아래ì—서 scanf 함수 ë˜ëŠ” cinì„ ì‚¬ìš©í•˜ì—¬ í‘œì¤€ìž…ë ¥ ëŒ€ì‹ input.txt 파ì¼ë¡œ 부터 ìž…ë ¥ê°’ì„ ì½ì–´ 올 수 있습니다. ë˜í•œ, ë³¸ì¸ PCì—서 freopen 함수를 사용하지 ì•Šê³ í‘œì¤€ìž…ë ¥ì„ ì‚¬ìš©í•˜ì—¬ í…ŒìŠ¤íŠ¸í•˜ì…”ë„ ë¬´ë°©í•©ë‹ˆë‹¤. 단, Codeground 시스템ì—서 "ì œì¶œí•˜ê¸°" í• ë•Œì—는 반드시 freopen 함수를 지우거나 주ì„(//) 처리 하셔야 합니다. */ //freopen("input.txt", "r", stdin); setbuf(stdout, NULL); int TC; int test_case; scanf("%d", &TC); // cin 사용 가능 for (test_case = 1; test_case <= TC; test_case++) { // ì´ ë¶€ë¶„ì—서 ì•Œê³ ë¦¬ì¦˜ í”„ë¡œê·¸ëž¨ì„ ìž‘ì„±í•˜ì‹ì‹œì˜¤. int x = 0, y = 0; long long int ans = 1; int n, k; char c; scanf("%d %d", &n, &k); for (int i = 0; i < k; i++){ cin >> c; switch (c){ case 'D': x++; break; case 'U': x--; break; case 'L': y--; break; case 'R': y++; break; } long long int sum = x + y; if (sum < n - 1){ ans += (1 + sum) * sum / 2; if (sum % 2 == 1){ ans += sum - y + 1; } else{ ans += sum - x + 1; } } else{ ans += (1 + n) * n / 2; ans += (3 * n - sum - 1)*(sum - n) / 2; if (sum % 2 == 1){ ans += sum - n + 2 - y; } else{ ans += sum - n + 2 - x; } } } // ì´ ë¶€ë¶„ì—서 ì •ë‹µì„ ì¶œë ¥í•˜ì‹ì‹œì˜¤. printf("Case #%d\n", test_case); // cout 사용 가능 printf("%lld\n", ans); } return 0; // ì •ìƒì¢…료 시 반드시 0ì„ ë¦¬í„´í•´ì•¼ 합니다. } }}} = ì•„ì´ë””ì–´ = == ë°•ì¸ì„œ == * 숫ìžë¥¼ ì¼ì¼ì´ 채워 ë„£ì„ ìˆ˜ 없다. * í™€ì§ ë§ˆë‹¤ ê·œì¹™ì„±ì„ ë‚˜ëˆ ì„œ 좌표를 넣으면 ê·¸ ìœ„ì¹˜ì— í•´ë‹¹í•˜ëŠ” 번호를 가르킬 수 있게 만듬. * 숫ìžë¥¼ ì…€ 때 대ê°ì„ ì— ìžˆëŠ” ìˆ˜ì˜ ê°¯ìˆ˜ê°€ 늘어났다가 다시 ì¤„ì–´ë“¦ì„ ìž˜ 확ì¸í•˜ì—¬ì•¼ ë¨. == 15ì´ì›ì¤€ == * 머리가 ë‚˜ë¹ ì„œ 대ê°ì„ ì— ìžˆëŠ” 갯수가 1씩 늘어나거나 줄어드는 것과 ê° ëŒ€ê°ì„ ì— ìžˆëŠ” ì¢Œí‘œì˜ í•©ì´ ê°™ì€ ê²ƒì„ ì´ìš©í•˜ì—¬ 좌표(x,y)ì˜ ë°© 넘버를 구하기 위해 대ê°ì„ 1번째~대ê°ì„ (x+y)-1번째 줄까지 ê°¯ìˆ˜í•©ì„ ì—°ì†ëœ 숫ìžì˜ í•© 구하는 ê³µì‹ì„ ì´ìš©í•˜ì—¬ êµ¬í•˜ê³ ê° ëŒ€ê°ì„ ì˜ ì²«ë²ˆì§¸ í˜¹ì€ ë§ˆì§€ë§‰ë²ˆì§¸ì˜ xí˜¹ì€ y를 ì´ìš©í•˜ì—¬ 대ê°ì„ ì˜ ëª‡ë²ˆì§¸ 숫ìžì´ì§€ 구하여 (x,y)ì˜ ë°© 넘버를 구하였다. * ì´ë•Œ, n번째 줄 ì´í›„ì—는 ì¤„ì–´ë“ ë‹¤ëŠ” 것과 대ê°ì„ ì˜ ëª‡ë²ˆì§¸ 수ì¸ì§€ êµ¬í• ë•Œ n번째 ì´í›„ì—는 그냥 x와 yë§Œì„ ì´ìš©í•˜ë©´ 안ë˜ëŠ” 것과 n번째 ì´í›„ì˜ ëŒ€ê°ì„ ì—서 (x+y)-1번째 ì¤„ê¹Œì§€ì˜ í•© 구하는 ê²ƒì„ ì¢€ ë” ìƒê°í•´ 보아야한다. * ''' ë¬´ì—‡ì´ ìž˜ëª»ë˜ì—ˆì„까 난 90ì ì„ ë°›ì•˜ë‹¤...ã…‚ã„· '''